CopyImageWithDepth

Just starting out? Need help? Post your questions and find answers here.
User avatar
Michael Vogel
Addict
Addict
Posts: 2666
Joined: Thu Feb 09, 2006 11:27 pm
Contact:

CopyImageWithDepth

Post by Michael Vogel »

I am using the following routine:

Code: Select all

Procedure CopyImageWithDepth(Source.i,Destination.i,Depth)

	If ImageDepth(Source)<>Depth
		CreateImage(Destination,ImageWidth(Source),ImageHeight(Source),Depth)
		StartDrawing(ImageOutput(Destination))
		DrawImage(ImageID(Source),0,0)
		StopDrawing()
	Else
		CopyImage(Source,Destination)
	EndIf

EndProcedure
But sometimes I place calls for the routine within a StartDrawing()/StopDrawing() section. In such cases I need to stop drawing temporarly before calling CopyImageWithDepth and after the call StartDrawing, DrawingMode, DrawigFont, etc. needs to restored.

So my question is simple - does there exist another reliable method to do the CopyImageWithDepth stuff without using StartDrawing/StopDrawing inside the procedure?
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4636
Joined: Sun Apr 12, 2009 6:27 am

Re: CopyImageWithDepth

Post by RASHAD »

Maybe

Code: Select all

Procedure CopyImageWithDepth(Source.i,Destination.i,Depth)
	If ImageDepth(Source,#PB_Image_OriginalDepth) <> Depth
	  *Buffer = EncodeImage(Source, #PB_ImagePlugin_PNG,#PB_Image_FloydSteinberg,Depth)
    CatchImage(Destination,*Buffer)
    FreeMemory(*Buffer)
	EndIf
EndProcedure
Egypt my love
User avatar
Michael Vogel
Addict
Addict
Posts: 2666
Joined: Thu Feb 09, 2006 11:27 pm
Contact:

Re: CopyImageWithDepth

Post by Michael Vogel »

Nice try, but doesn't work here (PB 5.73)...

Code: Select all

Procedure CopyImageWithDepth(Source.i,Destination.i,Depth)

		UsePNGImageEncoder()
		
		Protected *Buffer

		If ImageDepth(Source,#PB_Image_OriginalDepth)<>Depth
			Debug ImageDepth(Source,#PB_Image_OriginalDepth)
			Debug depth
			*Buffer=EncodeImage(Source,#PB_ImagePlugin_PNG, #PB_Image_FloydSteinberg,Depth)
			CatchImage(Destination,*Buffer)
			FreeMemory(*Buffer)
			Debug ImageDepth(Destination)

		Else
			CopyImage(Source,Destination)

		EndIf

EndProcedure
...results in...

4
32
24

:shock:

Same happens when encoding is done for BMP type. Maybe a bug :cry:
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4636
Joined: Sun Apr 12, 2009 6:27 am

Re: CopyImageWithDepth

Post by RASHAD »

Works like charm PB 5.73 x86 - Windows 11 x64

Code: Select all

Procedure CopyImageWithDepth(Source.i,Destination.i,Depth)
		
		Protected *Buffer

		If ImageDepth(Source,#PB_Image_OriginalDepth)<>Depth
			Debug ImageDepth(Source,#PB_Image_OriginalDepth)
			Debug depth
			*Buffer=EncodeImage(Source,#PB_ImagePlugin_BMP, 0,Depth)
			CatchImage(Destination,*Buffer)
			FreeMemory(*Buffer)
			Debug ImageDepth(Destination)

		Else
			CopyImage(Source,Destination)

		EndIf

EndProcedure

LoadImage(0,"g:\mmedia\pictures\Board.bmp")
CopyImageWithDepth(0,1,8)
Debug ImageDepth(1,#PB_Image_OriginalDepth)
SaveImage(1,GetTemporaryDirectory()+"test.bmp")
Egypt my love
User avatar
Michael Vogel
Addict
Addict
Posts: 2666
Joined: Thu Feb 09, 2006 11:27 pm
Contact:

Re: CopyImageWithDepth

Post by Michael Vogel »

Are you able to test it with an 2 Bit-per-Pixel image?

Didn't find one quickly in the internet, but one with 8 gray shades (3 Bit) fails here as well... PB 5.73 (32 and 64 bit), Window 8.1 and Windows 10 (64 bit)

Code: Select all

Procedure CopyImageWithDepth(Source.i,Destination.i,Depth)

	CompilerIf 1
		UsePNGImageEncoder()
		
		Protected *Buffer

		If ImageDepth(Source,#PB_Image_OriginalDepth)<>Depth
			Debug ImageDepth(Source,#PB_Image_OriginalDepth)
			Debug depth
			;*Buffer=EncodeImage(Source,#PB_ImagePlugin_PNG, #PB_Image_FloydSteinberg,Depth)
			*Buffer=EncodeImage(Source,#PB_ImagePlugin_BMP,#Null,Depth)
			CatchImage(Destination,*Buffer)
			FreeMemory(*Buffer)
			Debug ImageDepth(Destination)

		Else
			CopyImage(Source,Destination)

		EndIf

	CompilerElse
		If ImageDepth(Source)<>Depth
			CreateImage(Destination,ImageWidth(Source),ImageHeight(Source),Depth)
			StartDrawing(ImageOutput(Destination))
			DrawImage(ImageID(Source),0,0)
			StopDrawing()
		Else
			CopyImage(Source,Destination)
		EndIf

	CompilerEndIf

EndProcedure


*buffer=AllocateMemory(5000)
; // https://www.google.com/imgres?imgurl=https%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2F8%2F8f%2FGrayscale_2bit_palette_sample_image.png&imgrefurl=https%3A%2F%2Fen.m.wikipedia.org%2Fwiki%2FFile%3AGrayscale_2bit_palette_sample_image.png&tbnid=6JAGURrljEJ5ZM&vet=12ahUKEwiH-ozuoN34AhUkYfEDHeTTB2IQMygBegQIARBy..i&docid=XCHCLK0Y_ZTPgM&w=150&h=200&q=2%20bit%20png%20gray&client=firefox-b-d&ved=2ahUKEwiH-ozuoN34AhUkYfEDHeTTB2IQMygBegQIARBy

size=Base64Decoder("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",*Buffer,5000)

UsePNGImageDecoder()
UsePNGImageEncoder()

CatchImage(0,*buffer)
CopyImageWithDepth(0,1,32)

ShowLibraryViewer("image",0)
Debug ":)"
Post Reply