Where can I download the FreeImage.dll wrapper ?

BlitzPlus Forums/BlitzPlus Programming/Where can I download the FreeImage.dll wrapper ?

kragoth74(Posted 2006) [#1]
As the name says... :) The link at BlitzCoder is dead...


CASO(Posted 2006) [#2]
I can't find it in the spot I downloaded it before. Hmm
The reason I got rid of it was because I couldn't get BP to recognise the userlib.


sswift(Posted 2006) [#3]
I don't know if there was a specific wrapper made for it. I think maybe there were three different ones, one of which I wrote. Anyway here's the one I have. The comments seem to ber in my style so I think I wrote it.

; -----------------------------------------------------------------------------------------------------------------------------------
; To use these functions you must create a freeimage.decls file in your decls directory with the following lines:
;
; 	.lib "FreeImage.dll"
;
; 	FIAllocate%( Width%,Height%,BPP%,RedMask%,GreenMask%,BlueMask% ) : "_FreeImage_Allocate@24"
; 	FILoad%( ImageType%,File$,Mode% ) : "_FreeImage_Load@12"
; 	FISave%( ImapeType%,FIBITMAP%,File$,Flags% ) : "_FreeImage_Save@16"
; 	FIUnload%( FIBITMAP% ) : "_FreeImage_Unload@4"
;	FIGetDescription$( FREE_IMAGE_FORMAT% ) : "_FreeImage_GetFIFDescription@4"
; 	FIGetType%( File$,Default% ) : "_FreeImage_GetFileType@8"
;	FIToBank( Bank*,FIBITMAP%,Pitch%,Depth%,Red_Mask%,Green_Mask%,Blue_Mask%,TopDown% ) : "_FreeImage_ConvertToRawBits@32"
;	FIGuessType%( File$ ) : "_FreeImage_GetFIFFromFilename@4"
;	FIGetClrUsed%( FIBITMAP% ) : "_FreeImage_GetColorsUsed@4"
;	FIGetBitStart%( FIBITMAP% ) : "_FreeImage_GetBits@4"
;	FIGetScanLine%( FIBITMAP%,ScanLine% ) : "_FreeImage_Get@8"
; 	FIGetDepth%( FIBITMAP% ) : "_FreeImage_GetBPP@4"
;	FIGetWidth%( FIBITMAP% ) : "_FreeImage_GetWidth@4"
;	FIGetBits%( FIBITMAP% ) : "_FreeImage_GetBits@4"
;	FIGetHeight%( FIBITMAP% ) : "_FreeImage_GetHeight@4"
;	FIGetLine%( FIBITMAP% ) : "_FreeImage_GetLine@4"
;	FIGetPitch%( FIBITMAP% ) : "_FreeImage_GetPitch@4"
;	FIGetSize%( FIBITMAP% ) : "_FreeImage_GetDIBSize@4"
;	FIGetPalette%( FIBITMAP% ) : "_FreeImage_GetPalette@4"
;	FIGetDPMX%( FIBITMAP% ) : "_FreeImage_GetDotsPerMeterX@4"
;	FIGetDPMY%( FIBITMAP% ) : "_FreeImage_GetDotsPerMeterY@4"
;	FIGetHeader%( FIBITMAP% ) : "_FreeImage_GetInfoHeader@4"
;	FIGetInfo%( FIBITMAP% ) : "_FreeImage_GetInfo@4"
;	FIGetColorType%( FIBITMAP% ) : "_FreeImage_GetColorType@4"
;	FIGetRedMask%( FIBITMAP% ) : "_FreeImage_GetRedMask@4"
;	FIGetGreenMask%( FIBITMAP% ) : "_FreeImage_GetGreenMask@4"
;	FIGetBlueMask%( FIBITMAP% ) : "_FreeImage_GetBlueMask@4"
;	FIGetTranCount%( FIBITMAP% ) : "_FreeImage_GetTransparencyCount@4"
;	FIGetTranTable%( FIBITMAP% ) : "_FreeImage_GetTransparencyTable@4"
;	FISetTran( FIBITMAP%,Flag% ) : "_FreeImage_SetTransparent@8"
;	FIIsTran%( FIBITMAP% ) : "_FreeImage_IsTransparent@4"
;	FIConvert8Bits%( FIBITMAP% ) : "_FreeImage_ConvertTo8Bits@4"
;	FIConvert555%( FIBITMAP% ) : "_FreeImage_ConvertTo16Bits555@4"
;	FIConvert565%( FIBITMAP% ) : "_FreeImage_ConvertTo16Bits565@4"
;	FIConvert24Bits%( FIBITMAP% ) : "_FreeImage_ConvertTo24Bits@4"
;	FIConvert32Bits%( FIBITMAP% ) : "_FreeImage_ConvertTo32Bits@4"
;	FIColorQuantize%( FIBITMAP%,Flag% ) : "_FreeImage_ColorQuantize@8"
;	FIThreshold%( FIBITMAP%,Flag% ) : "_FreeImage_Threshold@8"
;	FIDither%( FIBITMAP%,Algo% ) : "_FreeImage_Dither@8"
;	FIFromBank%( Bank*,Width%,Height%,Pitch%,Depth%,RedMask%,GreenMask%,BlueMask%,TopDown% ) : "_FreeImage_ConvertFromRawBits@36"
;	FIClone%(DIB%) : "_FreeImage_Clone@4"
;
; -----------------------------------------------------------------------------------------------------------------------------------
; Freeimage supports the following file types:
;
; 	BMP files       [reading, writing]
; 	TARGA files     [reading, writing]
; 	TIFF files      [reading, writing]
; 	JPEG/JIF files  [reading, writing]
; 	GIF files       [reading, writing]
; 	PNG files       [reading, writing]
; 	WBMP files      [reading, writing]
; 	ICO files       [reading, writing]
; 	PBM files       [reading, writing]
; 	PGM files       [reading, writing]
; 	PPM files       [reading, writing]
; 	XPM files       [reading, writing]
;
;	DDS files       [reading]
; 	PhotoShop files [reading]
; 	Kodak PhotoCD   [reading]
; 	PCX files       [reading]
; 	Dr. Halo files  [reading] 
; 	IFF files       [reading]
; 	JNG files       [reading]
; 	KOALA files     [reading]
; 	LBM files       [reading]
; 	MNG files       [reading]
; 	Sun RAS files   [reading]
; 	XBM files       [reading]
; -----------------------------------------------------------------------------------------------------------------------------------


; Image formats:

	Const FIF_UNKNOWN = -1
	Const FIF_BMP     =  0
	Const FIF_ICO     =  1
	Const FIF_JPEG    =  2
	Const FIF_JNG     =  3
	Const FIF_KOALA   =  4
	Const FIF_LBM     =  5
	Const FIF_IFF     =  5
	Const FIF_MNG     =  6
	Const FIF_PBM     =  7
	Const FIF_PBMRAW  =  8
	Const FIF_PCD     =  9
	Const FIF_PCX     = 10
	Const FIF_PGM     = 11
	Const FIF_PGMRAW  = 12
	Const FIF_PNG     = 13
	Const FIF_PPM     = 14
	Const FIF_PPMRAW  = 15
	Const FIF_RAS     = 16
	Const FIF_TARGA   = 17
	Const FIF_TIFF    = 18
	Const FIF_WBMP    = 19
	Const FIF_PSD     = 20
	Const FIF_CUT     = 21
	Const FIF_XBM     = 22
	Const FIF_XPM     = 23
	Const FIF_DDS     = 24
	Const FIF_GIF     = 25


; Compression settings:

	Const FIC_DEFAULT            = $0

	Const FIC_BMP_RLE            = $1

	Const FIC_JPEG_SUPERB        = $80	; 100% quality
	Const FIC_JPEG_GOOD          = $100	;  75% quality (default)
	Const FIC_JPEG_NORMAL        = $200	;  50% quality
	Const FIC_JPEG_AVERAGE       = $400	;  25% quality
	Const FIC_JPEG_BAD           = $800	;  10% quality
	Const FIC_TIFF_PACKBITS      = $100
	Const FIC_TIFF_DEFLATE       = $200
	Const FIC_TIFF_ADOBE_DEFLATE = $400	
	Const FIC_TIFF_NONE          = $800 


; Image loading flags:

	Const JPEG_ACCURATE = 2

; Image formats:

	Global FIB_BitDepth[4]
	Global FIB_RedMask[4]
	Global FIB_GreenMask[4]
	Global FIB_BlueMask[4]

	FIB_BitDepth[1]  = 16
	FIB_RedMask[1]   = $1F
	FIB_GreenMask[1] = $7E0
	FIB_BlueMask[1]  = $F800

	FIB_BitDepth[2]  = 16
	FIB_RedMask[2]   = $1F
	FIB_GreenMask[2] = $3E0
	FIB_BlueMask[2]  = $7C00

	FIB_BitDepth[3]  = 24
	FIB_RedMask[3]   = $FF0000
	FIB_GreenMask[3] = $FF00
	FIB_BlueMask[3]  = $FF

	FIB_BitDepth[4]  = 32
	FIB_RedMask[4]   = $FF0000
	FIB_GreenMask[4] = $FF00
	FIB_BlueMask[4]  = $FF


; -----------------------------------------------------------------------------------------------------------------------------------
; This function loads an image into Blitz using the Freeimage library.
; -----------------------------------------------------------------------------------------------------------------------------------
Function FILoadImage(Filename$)

	Local FI_FileType
	Local FI_Bitmap
	Local FI_Width, FI_Height
	Local DestImage, DestImageBuffer
	Local DestImageBank, DestImagePitch, DestImageFormat
	Local DestImageDepth, DestImageRedMask, DestImageGreenMask, DestImageBlueMask

	; Get the filetype.
		
		; First try to get the file type from the file header.
		; If that fails, try to guess the filetype from the file extension.
		; If that fails, return from function with failure.
		
		FI_FileType = FIGetType(Filename$, 0)
		
		If FI_FileType = -1
			FI_FileType = FIGuessType(Filename$)
			If FI_FileType = -1 Return
		EndIf
	
	; Attempt to load the image.  If the image fails to load, return from the function.
		
		If FI_FileType = FIF_JPEG
			;FI_Bitmap = FILoad(FI_FileType, Filename$, JPEG_ACCURATE)
			FI_Bitmap = FILoad(FI_FileType, Filename$, 0)
		Else
			FI_Bitmap = FILoad(FI_FileType, Filename$, 0)
		EndIf
		
		If Not FI_Bitmap Return 	
	
	; Get the width and height of the image.
		FI_Width  = FIGetWidth(FI_Bitmap)		
		FI_Height = FIGetHeight(FI_Bitmap)
		
	; Create an image in Blitz with the same width and height as the image loaded with freeimage.			
		DestImage = CreateImage(FI_Width, FI_Height, 1, 1)
		DestImageBuffer = ImageBuffer(DestImage)
	
	; Copy the FI_Image to the Blitz image.
	
		LockBuffer DestImageBuffer
			
			DestImageBank      = LockedPixels(DestImageBuffer)
			DestImagePitch     = LockedPitch(DestImageBuffer)
			DestImageFormat    = LockedFormat(DestImageBuffer)
			
			DestImageDepth     = FIB_BitDepth[DestImageFormat]
			DestimageRedMask   = FIB_RedMask[DestImageFormat]
			DestimageGreenMask = FIB_GreenMask[DestImageFormat]
			DestimageBlueMask  = FIB_BlueMask[DestImageFormat]
			
			FIToBank(DestImageBank, FI_Bitmap, DestImagePitch, DestImageDepth, DestimageRedMask, DestimageGreenMask, DestimageBlueMask, 0)                 

		UnlockBuffer DestImageBuffer

	; Free the loaded image.
		FIUnload FI_Bitmap
	
	; Return the pointer to the new Blitz image.
		Return DestImage
	
End Function


; -----------------------------------------------------------------------------------------------------------------------------------
; This function saves an image from Blitz using the Freeimage library.
; For JPEG, can specify integer 0..100 for compression to indicate desired quality.
; -----------------------------------------------------------------------------------------------------------------------------------
Function FISaveImage(SrcImage, Filename$, FI_FileType=FIF_UNKNOWN, FI_Compression=0)

	Local FI_Bitmap
	Local Success

	If SrcImage <> 0

		; If FI_FileType is unknown, attempt to determine the filetype the user is trying to save from the file extension.
		; Return from the function if fail.

			If FI_FileType = FIF_UNKNOWN
		
				FI_FileType = FIGuessType(Filename$)
				If FI_FileType = FIF_UNKNOWN Return
	
			EndIf
				
		; Is saving supported for this format?
				
		; Create a FI bitmap from the source image.
			FI_Bitmap = FIConvertImageToFIB(SrcImage)
		
		; Attempt to save the bitmap using the specified format.
			Success = FISave(FI_FileType, FI_Bitmap, Filename$, FI_Compression)
			If Not Success Then Notify "Unable to save image:" + Chr(10) + Filename$, True

		; Free the FI bitmap.		
			FIUnload(FI_Bitmap)
		
	EndIf

End Function


; -----------------------------------------------------------------------------------------------------------------------------------
; This function takes a Blitz image as input, and returns a FI bitmap.
; -----------------------------------------------------------------------------------------------------------------------------------
Function FIConvertImageToFIB(SrcImage)

	Local SrcBuffer
	Local SrcWidth, SrcHeight
	Local SrcBank, SrcPitch, SrcFormat
	Local SrcDepth
	Local SrcRedMask, SrcGreenMask, SrcBlueMask
	Local FI_Bitmap, FI_Bitmap24

	; Convert the Blitz image to an FI_Bitmap:

		SrcBuffer = ImageBuffer(SrcImage)
	
		LockBuffer SrcBuffer
		
			SrcWidth  = ImageWidth(SrcImage)
			SrcHeight = ImageHeight(SrcImage)
			
			SrcBank   = LockedPixels(SrcBuffer)
			SrcPitch  = LockedPitch(SrcBuffer)
			SrcFormat = LockedFormat(SrcBuffer)
		
			SrcDepth     = FIB_BitDepth[SrcFormat]
			SrcRedMask   = FIB_RedMask[SrcFormat]
			SrcGreenMask = FIB_GreenMask[SrcFormat]
			SrcBlueMask  = FIB_BlueMask[SrcFormat]
		
			FI_Bitmap = FIFromBank(SrcBank, SrcWidth, SrcHeight, SrcPitch, SrcDepth, SrcRedMask, SrcGreenMask, SrcBlueMask,0)

		UnlockBuffer SrcBuffer
	
	; Convert FI_Bitmap to 24bit if neccessary:	

		If FIGetDepth(FI_Bitmap) <> 24
	
			FI_Bitmap24 = FIConvert24Bits(FI_Bitmap)
		
			If FI_Bitmap24
				FIUnload(FI_Bitmap)
				FI_Bitmap = FI_Bitmap24
			EndIf
	
		EndIf
	
	; Return FI_Bitmap:
		Return FI_Bitmap

End Function



kragoth74(Posted 2006) [#4]
Thanks :)


JRalha(Posted 2011) [#5]
I've been trying FreeImage.dll (with these functions), and what happens is that the images are rendered upside-down.

Any idea what it could be and how to solve?

Last edited 2011


Yasha(Posted 2011) [#6]
Instead of a helpful suggestion (sorry, out of stock for today), here's a link to a more comprehensive FreeImage module:

http://www.blitzbasic.com/codearcs/codearcs.php?code=1732

Perhaps that will help.


JRalha(Posted 2011) [#7]
Ok...

I believe it addresses the problem.

Unfortunately the problem is that the algorithm for inverting the image is extremely slow! At the time I'm writing it's still processing the fourth file (>20 mins!)...

So I was thinking about flipping the image in Y axis. Is there any possible way to flip an image or buffer or whatever in a given axis?