With GetDIBits_() / SetDIBits_() for example (WinAPI).neotoma wrote:And how can i copy the images to a temporary buufer ?
I think PB uses StretchBlt_() for the resize internally.
Here some examples for GetDIBits_() / SetDIBits_():
CatchTransparentImage()
Code: Select all
;
; by Danilo, 14.12.2003 - german forum
;
Procedure CatchTransparentImage(Number,ImageLabel,TransColor,NewColor)
;>
;> Number = ImageNumber
;> ImageLabel = Label of the included Image
;> TransColor = RGB: Transparent Color, -1 = First Color in Picture
;> NewColor = RGB: New Color for TransColor, -1 = System Window Background
;>
Structure _CTI_BITMAPINFO
bmiHeader.BITMAPINFOHEADER
bmiColors.RGBQUAD[1]
EndStructure
Structure _CTI_LONG
l.l
EndStructure
Structure _CTI_WORD
w.w
EndStructure
hBmp = CatchImage(Number,ImageLabel)
If hBmp
hDC = StartDrawing(ImageOutput(Number))
If hDC
ImageWidth = ImageWidth(Number) : ImageHeight = ImageHeight(Number) : ImageDepth = ImageDepth(Number)
mem = GlobalAlloc_(#GMEM_FIXED|#GMEM_ZEROINIT,ImageWidth*ImageHeight*4)
If mem
bmi._CTI_BITMAPINFO
bmi\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER)
bmi\bmiheader\biWidth = ImageWidth
bmi\bmiheader\biHeight = ImageHeight
bmi\bmiheader\biPlanes = 1
bmi\bmiheader\biBitCount = ImageDepth
bmi\bmiheader\biCompression = #BI_RGB
If GetDIBits_(hDC,hBmp,0,ImageHeight(Number),mem,bmi,#DIB_RGB_COLORS) <> 0
If TransColor = -1
If ImageDepth=32
*pixels._CTI_LONG = mem+((ImageHeight-1)*ImageWidth*4)
TransColor = *pixels\l
Debug Hex(TransColor)
ElseIf ImageDepth=16
*pixelsW._CTI_WORD = mem+((ImageHeight-1)*ImageWidth*2)
TransColor2 = *pixelsW\w&$FFFF
Debug Hex(TransColor2)
EndIf
Else
If ImageDepth=32
TransColor = RGB(Blue(TransColor),Green(TransColor),Red(TransColor))
ElseIf ImageDepth=16
r.l = ((TransColor>>3)&%11111)
g.l = ((TransColor>>6)&%11111100000)
b.l = ((TransColor>>9)&%1111100000000000)
TransColor2 = (r|g|b)&$FFFF
Debug Hex(TransColor2)
EndIf
EndIf
If NewColor = -1
NewColor = GetSysColor_(#COLOR_BTNFACE) ; #COLOR_WINDOW
EndIf
NewColor = RGB(Blue(NewColor),Green(NewColor),Red(NewColor))
If ImageDepth=32
*pixels._CTI_LONG = mem
For a = 1 To ImageWidth*ImageHeight
If *pixels\l = TransColor
*pixels\l = NewColor
EndIf
*pixels + 4
Next a
ElseIf ImageDepth=16
r = ((NewColor>>3)&%11111)
g = ((NewColor>>6)&%11111100000)
b = ((NewColor>>9)&%1111100000000000)
NewColor2.w = (b|g|r)&$FFFF
*pixelsW._CTI_WORD = mem
For a = 1 To ImageWidth*ImageHeight
If *pixelsW\w&$FFFF = TransColor2
*pixelsW\w = NewColor2
EndIf
*pixelsW + 2
Next a
EndIf
If SetDIBits_(hDC,hBmp,0,ImageHeight(Number),mem,bmi,#DIB_RGB_COLORS) <> 0
Result = hBmp
EndIf
EndIf
GlobalFree_(mem)
EndIf
EndIf
StopDrawing()
EndIf
ProcedureReturn Result
EndProcedure
image1 = CatchTransparentImage(1,?Image_01,-1,-1)
If image1
OpenWindow(0,0,0,ImageWidth(image1),ImageHeight(image1),"Image",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
CreateGadgetList(WindowID(0))
ImageGadget(0,0,0,ImageWidth(image1),ImageHeight(image1),image1)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
Else
MessageRequester("ERROR","Cant load image!",#MB_ICONERROR)
EndIf
DataSection
Image_01:
IncludeBinary "c:\test.bmp"
EndDataSection
LoadTransparentImage()
Code: Select all
;
;
; by Danilo, 22.04.2003 - german forum
;
Procedure LoadTransparentImage(Number,FileName$,TransColor,NewColor)
;>
;> Number = ImageNumber
;> FileName$ = File Name
;> TransColor = RGB: Transparent Color, -1 = First Color in Picture
;> NewColor = RGB: New Color for TransColor, -1 = System Window Background
;>
Structure _LTI_BITMAPINFO
bmiHeader.BITMAPINFOHEADER
bmiColors.RGBQUAD[1]
EndStructure
Structure _LTI_LONG
l.l
EndStructure
hBmp = LoadImage(Number,FileName$)
If hBmp
hDC = StartDrawing(ImageOutput(Number))
If hDC
ImageWidth = ImageWidth(Number) : ImageHeight = ImageHeight(Number)
mem = GlobalAlloc_(#GMEM_FIXED|#GMEM_ZEROINIT,ImageWidth*ImageHeight*4)
If mem
bmi._LTI_BITMAPINFO
bmi\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER)
bmi\bmiheader\biWidth = ImageWidth
bmi\bmiheader\biHeight = ImageHeight
bmi\bmiheader\biPlanes = 1
bmi\bmiheader\biBitCount = 32
bmi\bmiheader\biCompression = #BI_RGB
If GetDIBits_(hDC,hBmp,0,ImageHeight(Number),mem,bmi,#DIB_RGB_COLORS) <> 0
If TransColor = -1
*pixels._LTI_LONG = mem+((ImageHeight-1)*ImageWidth*4)
TransColor = *pixels\l
Else
TransColor = RGB(Blue(TransColor),Green(TransColor),Red(TransColor))
EndIf
If NewColor = -1
NewColor = GetSysColor_(#COLOR_BTNFACE) ; #COLOR_WINDOW
EndIf
NewColor = RGB(Blue(NewColor),Green(NewColor),Red(NewColor))
*pixels._LTI_LONG = mem
For a = 1 To ImageWidth*ImageHeight
If *pixels\l = TransColor
*pixels\l = NewColor
EndIf
*pixels + 4
Next a
If SetDIBits_(hDC,hBmp,0,ImageHeight(Number),mem,bmi,#DIB_RGB_COLORS) <> 0
Result = hBmp
EndIf
EndIf
GlobalFree_(mem)
EndIf
EndIf
StopDrawing()
EndIf
ProcedureReturn Result
EndProcedure
image1 = LoadTransparentImage(1,"Test.bmp",-1,-1)
If image1
OpenWindow(0,0,0,ImageWidth(image1),ImageHeight(image1),"Image",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
CreateGadgetList(WindowID(0))
ImageGadget(0,0,0,ImageWidth(image1),ImageHeight(image1),image1)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
Else
MessageRequester("ERROR","Cant load image!",#MB_ICONERROR)
EndIf
ChangeImageColorChannel()
Code: Select all
;
; by Danilo, 22.04.2003 - german forum
;
;
Procedure ChangeImageColorChannel(SourceImage,DestImage,Red,Green,Blue)
;>
;> OriginalImage = number of Source Image
;> DestImage = number of New Image that gets changed (must be same size!)
;>
;> Red,Green,Blue = How much change this color channel ?
;> -255 -> Reduce color completely (fade out color)
;> 0 -> dont touch, change nothing
;> 255 -> add color to color channel (fade in)
;>
Structure _CIC_BITMAPINFO
bmiHeader.BITMAPINFOHEADER
bmiColors.RGBQUAD[1]
EndStructure
Structure _CIC_LONG
l.l
EndStructure
If IsImage(SourceImage)=0 Or IsImage(DestImage)=0
ProcedureReturn 0
EndIf
hBmp = ImageID(SourceImage)
hDC = StartDrawing(ImageOutput(hBmp))
If hDC
ImageWidth1 = ImageWidth(hBmp) : ImageHeight1 = ImageHeight(hBmp)
mem = GlobalAlloc_(#GMEM_FIXED|#GMEM_ZEROINIT,ImageWidth1*ImageHeight1*4)
If mem
bmi._CIC_BITMAPINFO
bmi\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER)
bmi\bmiheader\biWidth = ImageWidth1
bmi\bmiheader\biHeight = ImageHeight1
bmi\bmiheader\biPlanes = 1
bmi\bmiheader\biBitCount = 32
bmi\bmiheader\biCompression = #BI_RGB
If GetDIBits_(hDC,hBmp,0,ImageHeight1,mem,bmi,#DIB_RGB_COLORS) <> 0
StopDrawing()
hBmp = ImageID(DestImage)
hDC = StartDrawing(ImageOutput(hBmp))
If hDC
*pixels._CIC_LONG = mem
For a = 1 To ImageWidth1*ImageHeight1
RED2 = (*pixels\l >>16) & $FF
GREEN2= (*pixels\l >> 8) & $FF
BLUE2 = (*Pixels\l ) & $FF
If RED2 < RED And RED>0
RED2 = RED
ElseIf RED<0
RED2 = RED2+RED
If RED2<0:RED2=0:EndIf
EndIf
If GREEN2 < GREEN And GREEN>0
GREEN2 = GREEN
ElseIf GREEN<0
GREEN2 = GREEN2+GREEN
If GREEN2<0:GREEN2=0:EndIf
EndIf
If BLUE2 < BLUE And BLUE>0
BLUE2 = BLUE
ElseIf BLUE<0
BLUE2 = BLUE2+BLUE
If BLUE2<0:BLUE2=0:EndIf
EndIf
*pixels\l = (RED2<<16)|(GREEN2<<8)|(BLUE2)
*pixels + 4
Next a
If SetDIBits_(hDC,hBmp,0,ImageHeight1,mem,bmi,#DIB_RGB_COLORS) <> 0
Result = 1
EndIf
EndIf
StopDrawing()
EndIf
GlobalFree_(mem)
Else
StopDrawing()
EndIf
Else
StopDrawing()
EndIf
ProcedureReturn Result
EndProcedure
;- PROGRAM START
UseJPEGImageDecoder()
UsePNGImageDecoder()
UseTIFFImageDecoder()
UseTGAImageDecoder()
;FileName$ = OpenFileRequester("SELECT IMAGE","","BMP|*.bmp",0)
FileName$ = OpenFileRequester("SELECT IMAGE","","Image Files|*.bmp;*.jpg;*.jpeg;*.png;*.tiff;*.tga|All Files|*.*",0)
;Filename$ = "Test.bmp"
If FileName$
If LoadImage(1,FileName$)
ImageWidth = ImageWidth(1)
ImageHeight = ImageHeight(1)
If ImageWidth >800:ImageWidth =800:Resize=1:EndIf
If ImageHeight>600:ImageHeight=600:Resize=1:EndIf
If Resize
ResizeImage(1,ImageWidth,ImageHeight)
EndIf
If CreateImage(2,ImageWidth,ImageHeight)
WinWidth = ImageWidth+140
WinHeight = ImageHeight : If WinHeight < 300:WinHeight=300:EndIf
OpenWindow(0,0,0,WinWidth,WinHeight,"Image",#PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_Invisible)
TrackBarGadget(1,ImageWidth+10,18,40,250,0,255*2,#PB_TrackBar_Vertical):SetGadgetState(1,255)
TrackBarGadget(2,ImageWidth+50,18,40,250,0,255*2,#PB_TrackBar_Vertical):SetGadgetState(2,255)
TrackBarGadget(3,ImageWidth+90,18,40,250,0,255*2,#PB_TrackBar_Vertical):SetGadgetState(3,255)
TextGadget(8,ImageWidth+10,270,40,20,"R: 000")
TextGadget(9,ImageWidth+50,270,40,20,"G: 000")
TextGadget(0,ImageWidth+90,270,40,20,"B: 000")
ImageGadget(7,0,0,WinWidth-140,ImageHeight,ImageID(2))
HideWindow(0,0):SetForegroundWindow_(WindowID(0))
;- PROGRAM EVENT LOOP
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow:End
Case #PB_Event_Gadget
Gadget = EventGadget()
Select Gadget
Case 1:RED = GetGadgetState(1)-255:SetGadgetText(8,"R: "+RSet(Str(RED ),4," ")):ChangeImageColorChannel(1,2,RED,GREEN,BLUE):SetGadgetState(7,ImageID(2))
Case 2:GREEN = GetGadgetState(2)-255:SetGadgetText(9,"G: "+RSet(Str(GREEN),4," ")):ChangeImageColorChannel(1,2,RED,GREEN,BLUE):SetGadgetState(7,ImageID(2))
Case 3:BLUE = GetGadgetState(3)-255:SetGadgetText(0,"B: "+RSet(Str(BLUE ),4," ")):ChangeImageColorChannel(1,2,RED,GREEN,BLUE):SetGadgetState(7,ImageID(2))
EndSelect
EndSelect
ForEver
Else
MessageRequester("ERROR","Cant create image!",#MB_ICONERROR)
EndIf
Else
MessageRequester("ERROR","Cant load image!",#MB_ICONERROR)
EndIf
EndIf
;-PROGRAM END
GrayImage()
Code: Select all
;
; by Danilo, 22.04.2003 - german forum
;
Procedure GrayImage(Number)
;>
;> Number = ImageNumber
;>
Structure _GI_BITMAPINFO
bmiHeader.BITMAPINFOHEADER
bmiColors.RGBQUAD[1]
EndStructure
Structure _GI_LONG
l.l
EndStructure
Structure _GI_BGR
R.b
G.b
B.b
A.b
EndStructure
hBmp = ImageID(Number)
If hBmp
hDC = StartDrawing(ImageOutput(Number))
If hDC
ImageWidth = ImageWidth(Number) : ImageHeight = ImageHeight(Number)
mem = GlobalAlloc_(#GMEM_FIXED|#GMEM_ZEROINIT,ImageWidth*ImageHeight*4)
If mem
bmi._GI_BITMAPINFO
bmi\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER)
bmi\bmiheader\biWidth = ImageWidth
bmi\bmiheader\biHeight = ImageHeight
bmi\bmiheader\biPlanes = 1
bmi\bmiheader\biBitCount = 32
bmi\bmiheader\biCompression = #BI_RGB
If GetDIBits_(hDC,hBmp,0,ImageHeight(Number),mem,bmi,#DIB_RGB_COLORS) <> 0
*pixels._GI_LONG = mem
*COLORS._GI_BGR = mem
For a = 1 To ImageWidth*ImageHeight
color.b = Int((0.299* *COLORS\R) + (0.587* *COLORS\G) + (0.114* *COLORS\B))
*pixels\l = RGB(color,color,color)
*pixels + 4
*COLORS + 4
Next a
If SetDIBits_(hDC,hBmp,0,ImageHeight(Number),mem,bmi,#DIB_RGB_COLORS) <> 0
Result = hBmp
EndIf
EndIf
GlobalFree_(mem)
EndIf
EndIf
StopDrawing()
EndIf
ProcedureReturn Result
EndProcedure
UseJPEGImageDecoder()
UsePNGImageDecoder()
UseTIFFImageDecoder()
UseTGAImageDecoder()
;FileName$ = OpenFileRequester("SELECT IMAGE","","BMP|*.bmp",0)
FileName$ = OpenFileRequester("SELECT IMAGE","","Image Files|*.bmp;*.jpg;*.jpeg;*.png;*.tiff;*.tga|All Files|*.*",0)
;Filename$ = "Test.bmp"
If FileName$
If LoadImage(1,FileName$)
GrayImage(1)
OpenWindow(0,0,0,ImageWidth(1),ImageHeight(1),"Image",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
CreateGadgetList(WindowID(0))
ImageGadget(0,0,0,ImageWidth(1),ImageHeight(1),ImageID(0))
HideWindow(0,0):SetForegroundWindow_(WindowID(0))
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
Else
MessageRequester("ERROR","Cant load image!",#MB_ICONERROR)
EndIf
EndIf
Small Test to fill the image buffer
Code: Select all
;
; by Danilo, 22.04.2003 - german forum
;
Procedure GrayImage(Number)
;>
;> Number = ImageNumber
;>
Structure _GI_BITMAPINFO
bmiHeader.BITMAPINFOHEADER
bmiColors.RGBQUAD[1]
EndStructure
Structure _GI_LONG
l.l
EndStructure
Structure _GI_BGR
R.b
G.b
B.b
A.b
EndStructure
hBmp = ImageID(Number)
If hBmp
hDC = StartDrawing(ImageOutput(Number))
If hDC
ImageWidth = ImageWidth(Number) : ImageHeight = ImageHeight(Number)
mem = GlobalAlloc_(#GMEM_FIXED|#GMEM_ZEROINIT,ImageWidth*ImageHeight*4)
If mem
bmi._GI_BITMAPINFO
bmi\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER)
bmi\bmiheader\biWidth = ImageWidth
bmi\bmiheader\biHeight = ImageHeight
bmi\bmiheader\biPlanes = 1
bmi\bmiheader\biBitCount = 32
bmi\bmiheader\biCompression = #BI_RGB
If GetDIBits_(hDC,hBmp,0,ImageHeight(Number),mem,bmi,#DIB_RGB_COLORS) <> 0
*pixels._GI_LONG = mem
*COLORS._GI_BGR = mem
For a = 1 To ImageWidth*ImageHeight
color.b = Int((0.299* *COLORS\R) + (0.587* *COLORS\G) + (0.114* *COLORS\B))
*pixels\l = RGB(color,color,color)
*pixels + 4
*COLORS + 4
Next a
If SetDIBits_(hDC,hBmp,0,ImageHeight(Number),mem,bmi,#DIB_RGB_COLORS) <> 0
Result = hBmp
EndIf
EndIf
GlobalFree_(mem)
EndIf
EndIf
StopDrawing()
EndIf
ProcedureReturn Result
EndProcedure
UseJPEGImageDecoder()
UsePNGImageDecoder()
UseTIFFImageDecoder()
UseTGAImageDecoder()
;FileName$ = OpenFileRequester("SELECT IMAGE","","BMP|*.bmp",0)
FileName$ = OpenFileRequester("SELECT IMAGE","","Image Files|*.bmp;*.jpg;*.jpeg;*.png;*.tiff;*.tga|All Files|*.*",0)
;Filename$ = "Test.bmp"
If FileName$
If LoadImage(1,FileName$)
GrayImage(1)
OpenWindow(0,0,0,ImageWidth(1),ImageHeight(1),"Image",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
CreateGadgetList(WindowID(0))
ImageGadget(0,0,0,ImageWidth(1),ImageHeight(1),ImageID(0))
HideWindow(0,0):SetForegroundWindow_(WindowID(0))
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
Else
MessageRequester("ERROR","Cant load image!",#MB_ICONERROR)
EndIf
EndIf
Only example 1 should work with 16bit screenmode, others are
all for 32bit desktops only.
It shows you how it works and whats possible... maybe it helps.