CreateDIBitmap und FreeImage.dll

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Rico
Beiträge: 24
Registriert: 06.09.2005 13:58

CreateDIBitmap und FreeImage.dll

Beitrag von Rico »

Hallo,

ich möchte die FreeImage.dll zum Anzeigen von Grafiken in einem ImageGadget verwenden. Bis zur Anzeige des siebten oder achten Bildes funktioniert der Code auch. Leider bleibt das ImageGadget irgendwann leer, bzw. der Aufruf CreateDIBitmap gibt mir 0 zurück.


Leider habe ich nirgends ein Beispiel zur Verwendung der DLL in PureBasic gefunden ausser dem Wrapper im Forum und bei den Includes zu JaPBe (ist scheinbar noch für PB-Version 3.93).

Die Hilfe zur DLL bringt mich nicht weiter. Evtl. kann mir ja einer einen Tip geben, woran es liegt dass er die Bilder anzeigt und dann nicht mehr

Ich befinde mich möglicherweise auch komplett auf dem Holzweg.

Hier mein Code:

[test.pb]

Code: Alles auswählen

IncludeFile "FreeImage.pbi"

FreeImage_Init(#False)

UseTIFFImageDecoder() ;nur für Teil 'ohne FreeImage.dll'
UseJPEGImageDecoder() ;nur für Teil 'ohne FreeImage.dll'

;- Window Constants
Enumeration
  #Window_0
EndEnumeration
#gg_image_breite = 380
#gg_image_hoehe = 530

;- Gadget Constants
Enumeration
  #ExplorerTree_0
  #ExplorerList_0
  #Image_0
EndEnumeration

;-Fenster erzeugen
Procedure Open_Window_0()
  If OpenWindow(#Window_0, 0, 0, 800, 600, "TEST",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
    If CreateGadgetList(WindowID(#Window_0))
      ExplorerTreeGadget(#ExplorerTree_0, 0, 0, 200, 140, "",#PB_Explorer_NoFiles)
      ExplorerListGadget(#ExplorerList_0, 0, 140, 200, 400, "",#PB_Explorer_NoFolders | #PB_Explorer_NoParentFolder)
      ImageGadget(#Image_0, 210, 10, 400, 530, 0,#PB_Image_Border)
      
    EndIf
  EndIf
EndProcedure

Open_Window_0()

Repeat
  
  Event = WaitWindowEvent()
  
  WindowID = EventWindow()
  
  GadgetID = EventGadget()
  
  EventType = EventType()
  
  If Event = #PB_Event_Gadget
    
    If GadgetID = #ExplorerTree_0
      SetGadgetText(#ExplorerList_0,GetGadgetText(#ExplorerTree_0) + "*.jpg")
      verzeichnis.s = GetGadgetText(#ExplorerTree_0)
    ElseIf GadgetID = #ExplorerList_0
      eintrag =  GetGadgetState(#ExplorerList_0)
      If EventType = #PB_EventType_Change
        datei.s = GetGadgetText(#ExplorerList_0) + GetGadgetItemText(#ExplorerList_0,eintrag,0)
        Debug datei
        If FileSize(datei)>0
;############################################################################## 
; mit FreeImage-dll
          geladenesBild = FreeImage_Load(#FIF_JPEG,datei,0)
          Debug geladenesBild
          Debug "BITS = " + Str(FreeImage_GetBits(geladenesBild))
          Debug "BPP = " + Str(FreeImage_GetBPP(geladenesBild))
          
          breite = FreeImage_GetWidth(geladenesBild)
          hoehe = FreeImage_GetHeight(geladenesBild)  
          
          Debug breite
          Debug hoehe  
          neu_imageID = FreeImage_DIB_To_BITMAP(geladenesBild)

          SetGadgetState(#Image_0,neu_imageID)
          
          FreeImage_Unload(geladenesBild)
          
;##############################################################################         
          
          
;##############################################################################         
; ohne FreeImage-dll
          ;If LoadImage(0, datei)
          ;  breite = ImageWidth(0)
          ;  hoehe = ImageHeight(0)
          ;  
          ;  Image0 = ImageID(0) 
          ;  
          ;  neue_breite = #gg_image_breite
          ;  neue_hoehe = hoehe * #gg_image_breite / breite
          ;  
          ;  ResizeImage(0,neue_breite,neue_hoehe)
          ;  SetGadgetState(#Image_0, ImageID(0))
          ;  
          ;  Debug breite
          ;  Debug hoehe 
          ;   
          ;EndIf
;##############################################################################
        EndIf
      EndIf
    EndIf
  EndIf 
Until Event = #PB_Event_CloseWindow
End
[FreeImage.pbi]

Code: Alles auswählen

;Info: Wrapper for FreeImage.DLL for extended Picture-Formats
;XIncludeFile "API-Library.pbi"

Structure FreeImageIO
  read_proc.l
  write_proc.l
  seek_proc.l
  tell_proc.l
EndStructure

#FIF_UNKNOWN = -1
#FIF_BMP     =  0
#FIF_ICO     =  1
#FIF_JPEG    =  2
#FIF_JNG     =  3
#FIF_KOALA   =  4
#FIF_LBM     =  5
#FIF_MNG     =  6
#FIF_PBM     =  7
#FIF_PBMRAW  =  8
#FIF_PCD     =  9
#FIF_PCX     = 10
#FIF_PGM     = 11
#FIF_PGMRAW  = 12
#FIF_PNG     = 13
#FIF_PPM     = 14
#FIF_PPMRAW  = 15
#FIF_RAS     = 16
#FIF_TARGA   = 17
#FIF_TIFF    = 18
#FIF_WBMP    = 19
#FIF_PSD     = 20
#FIF_CUT     = 21
#FIF_IFF = #FIF_LBM
#FIC_MINISWHITE = 0
#FIC_MINISBLACK = 1
#FIC_RGB        = 2
#FIC_PALETTE    = 3
#FIC_RGBALPHA   = 4
#FIQ_WUQUANT    = 0
#FIQ_NNQUANT    = 1
#True           = 1
#False          = 0
#BMP_DEFAULT         = 0
#CUT_DEFAULT         = 0
#ICO_DEFAULT         = 0
#ICO_FIRST           = 0
#ICO_SECOND          = 0
#ICO_THIRD           = 0
#IFF_DEFAULT         = 0
#JPEG_DEFAULT        = 0
#JPEG_FAST           = 1
#JPEG_ACCURATE       = 2
#JPEG_QUALITYSUPERB  = $80
#JPEG_QUALITYGOOD    = $100
#JPEG_QUALITYNORMAL  = $200
#JPEG_QUALITYAVERAGE = $400
#JPEG_QUALITYBAD     = $800
#KOALA_DEFAULT       = 0
#LBM_DEFAULT         = 0
#MNG_DEFAULT         = 0
#PCD_DEFAULT         = 0
#PCD_BASE            = 1
#PCD_BASEDIV4        = 2
#PCD_BASEDIV16       = 3
#PCX_DEFAULT         = 0
#PNG_DEFAULT         = 0
#PNG_IGNOREGAMMA     = 1
#PNM_DEFAULT         = 0
#PNM_SAVE_RAW        = 0
#PNM_SAVE_ASCII      = 1
#RAS_DEFAULT         = 0
#TARGA_DEFAULT       = 0
#TARGA_LOAD_RGB888   = 1
#TARGA_LOAD_RGB555   = 2
#TIFF_DEFAULT        = 0
#WBMP_DEFAULT        = 0
#PSD_DEFAULT         = 0
#MAX_PATH     = 260
#BI_RGB       = 0
#BI_RLE8      = 1
#BI_RLE4      = 2
#BI_BITFIELDS = 3

Global DLL_FreeImageHandle_

Procedure API_OpenLibrary(DLL$)
  ProcedureReturn LoadLibrary_(DLL$)
EndProcedure
Procedure API_IsFunction(DLLHandle,name$)
  ProcedureReturn GetProcAddress_(DLLHandle,name$)
EndProcedure
Procedure API_FreeLibrary(DLLHandle)
  ProcedureReturn FreeLibrary_(DLLHandle)
EndProcedure

Procedure FreeImage_Init(LoadLocalPluginsOnly)
  If DLL_FreeImageHandle_=0
    DLL_FreeImageHandle_=API_OpenLibrary("FreeImage.DLL")
    If DLL_FreeImageHandle_
      ProcedureReturn CallFunctionFast(API_IsFunction(DLL_FreeImageHandle_,"_FreeImage_Initialise@4"),LoadLocalPluginsOnly)
    EndIf
  EndIf
  ProcedureReturn #False
EndProcedure
Procedure FreeImage_DeInit()
  Result=CallFunctionFast(API_IsFunction(DLL_FreeImageHandle_,"_FreeImage_DeInitialise@0"))
  API_FreeLibrary(DLL_FreeImageHandle_)
  ProcedureReturn Result
EndProcedure
Procedure.s FreeImage_GetVersion()
  ProcedureReturn PeekS(CallFunctionFast(API_IsFunction(DLL_FreeImageHandle_,"_FreeImage_GetVersion@0")))
EndProcedure
Procedure.s FreeImage_GetCopyrightMessage()
  ProcedureReturn PeekS(CallFunctionFast(API_IsFunction(DLL_FreeImageHandle_,"_FreeImage_GetCopyrightMessage@0")))
EndProcedure
Procedure FreeImage_Allocate(width,height,BitsPerPixel,Red_Mask,Green_Mask,Blue_Mask)
  ProcedureReturn CallFunctionFast(API_IsFunction(DLL_FreeImageHandle_,"_FreeImage_Allocate@24"),width,height,BitsPerPixel,Red_Mask,Green_Mask,Blue_Mask)
EndProcedure
Procedure FreeImage_Free(dib)
  ProcedureReturn CallFunctionFast(API_IsFunction(DLL_FreeImageHandle_,"_FreeImage_Free@4"),dib)
EndProcedure
Procedure FreeImage_Unload(dib)
  ProcedureReturn CallFunctionFast(API_IsFunction(DLL_FreeImageHandle_,"_FreeImage_Unload@4"),dib)
EndProcedure
Procedure FreeImage_GetFIFCount()
  ProcedureReturn CallFunctionFast(API_IsFunction(DLL_FreeImageHandle_,"_FreeImage_GetFIFCount@0"))
EndProcedure
Procedure FreeImage_GetFIFFromFormat(Format$)
  ProcedureReturn CallFunctionFast(API_IsFunction(DLL_FreeImageHandle_,"_FreeImage_GetFIFFromFormat@4"),@Format$)
EndProcedure
Procedure FreeImage_GetFIFFromMime(Mime$)
  ProcedureReturn CallFunctionFast(API_IsFunction(DLL_FreeImageHandle_,"_FreeImage_GetFIFFromMime@4"),@Mime$)
EndProcedure
Procedure.s FreeImage_GetFormatFromFIF(ImageFormat)
  ProcedureReturn PeekS(CallFunctionFast(API_IsFunction(DLL_FreeImageHandle_,"_FreeImage_GetFormatFromFIF@4"),ImageFormat))
EndProcedure
Procedure.s FreeImage_GetFIFExtensionList(ImageFormat)
  ProcedureReturn PeekS(CallFunctionFast(API_IsFunction(DLL_FreeImageHandle_,"_FreeImage_GetFIFExtensionList@4"),ImageFormat))
EndProcedure
Procedure.s FreeImage_GetFIFDescription(ImageFormat)
  ProcedureReturn PeekS(CallFunctionFast(API_IsFunction(DLL_FreeImageHandle_,"_FreeImage_GetFIFDescription@4"),ImageFormat))
EndProcedure
Procedure.s FreeImage_GetFIFRegExpr(ImageFormat)
  ProcedureReturn PeekS(CallFunctionFast(API_IsFunction(DLL_FreeImageHandle_,"_FreeImage_GetFIFDescription@4"),ImageFormat))
EndProcedure
Procedure FreeImage_GetFIFFromFilename(Filename$)
  ProcedureReturn CallFunctionFast(API_IsFunction(DLL_FreeImageHandle_,"_FreeImage_GetFIFFromFilename@4"),@Filename$)
EndProcedure
Procedure FreeImage_FIFSupportsReading(ImageFormat)
  ProcedureReturn CallFunctionFast(API_IsFunction(DLL_FreeImageHandle_,"_FreeImage_FIFSupportsReading@4"),ImageFormat)
EndProcedure
Procedure FreeImage_FIFSupportsWriting(ImageFormat)
  ProcedureReturn CallFunctionFast(API_IsFunction(DLL_FreeImageHandle_,"_FreeImage_FIFSupportsWriting@4"),ImageFormat)
EndProcedure
Procedure FreeImage_FIFSupportsExportBPP(ImageFormat,BitsPerPixel)
  ProcedureReturn CallFunctionFast(API_IsFunction(DLL_FreeImageHandle_,"_FreeImage_FIFSupportsExportBPP@8"),ImageFormat,BitsPerPixel)
EndProcedure
Procedure FreeImage_Load(ImageFormat,Filename$,flags)
  Debug "imageformat = " + Str(ImageFormat)
  Debug @Filename$
  Debug "flags = " + Str(flags)
  ProcedureReturn CallFunctionFast(API_IsFunction(DLL_FreeImageHandle_,"_FreeImage_Load@12"),ImageFormat,@Filename$,flags)
EndProcedure
Procedure FreeImage_LoadFromHandle(ImageFormat,*IO_Callback_Functions.FreeImageIO,Handle,flags)
  ProcedureReturn CallFunctionFast(API_IsFunction(DLL_FreeImageHandle_,"_FreeImage_LoadFromHandle@16"),ImageFormat,*IO_Callback_Functions.FreeImageIO,Handle,flags)
EndProcedure
Procedure FreeImage_Save(ImageFormat,dib,Filename$,flags)
  ProcedureReturn CallFunctionFast(API_IsFunction(DLL_FreeImageHandle_,"_FreeImage_Save@16"),ImageFormat,dib,@Filename$,flags)
EndProcedure
Procedure FreeImage_GetFileType(Filename$)
  ProcedureReturn CallFunctionFast(API_IsFunction(DLL_FreeImageHandle_,"_FreeImage_GetFileType@8"),@Filename$,16)
EndProcedure
Procedure FreeImage_GetFileTypeFromHandle(*IO_Callback_Functions.FreeImageIO,Handle)
  ProcedureReturn CallFunctionFast(API_IsFunction(DLL_FreeImageHandle_,"_FreeImage_GetFileTypeFromHandle@12"),*IO_Callback_Functions.FreeImageIO,Handle,16)
EndProcedure
Procedure FreeImage_GetColorsUsed(dib)
  ProcedureReturn CallFunctionFast(API_IsFunction(DLL_FreeImageHandle_,"_FreeImage_GetColorsUsed@4"),dib)
EndProcedure
Procedure FreeImage_GetBits(dib)
  ProcedureReturn CallFunctionFast(API_IsFunction(DLL_FreeImageHandle_,"_FreeImage_GetBits@4"),dib)
EndProcedure
Procedure FreeImage_GetBPP(dib)
  ProcedureReturn CallFunctionFast(API_IsFunction(DLL_FreeImageHandle_,"_FreeImage_GetBPP@4"),dib)
EndProcedure
Procedure FreeImage_GetWidth(dib)
  ProcedureReturn CallFunctionFast(API_IsFunction(DLL_FreeImageHandle_,"_FreeImage_GetWidth@4"),dib)
EndProcedure
Procedure FreeImage_GetHeight(dib)
  ProcedureReturn CallFunctionFast(API_IsFunction(DLL_FreeImageHandle_,"_FreeImage_GetHeight@4"),dib)
EndProcedure
Procedure FreeImage_GetPalette(dib)
  ProcedureReturn CallFunctionFast(API_IsFunction(DLL_FreeImageHandle_,"_FreeImage_GetPalette@4"),dib)
EndProcedure
Procedure FreeImage_GetInfoHeader(dib)
  ProcedureReturn CallFunctionFast(API_IsFunction(DLL_FreeImageHandle_,"_FreeImage_GetInfoHeader@4"),dib)
EndProcedure
Procedure FreeImage_GetInfo(dib)
  ProcedureReturn CallFunctionFast(API_IsFunction(DLL_FreeImageHandle_,"_FreeImage_GetInfo@4"),dib)
EndProcedure
Procedure FreeImage_GetColorType(dib)
  ProcedureReturn CallFunctionFast(API_IsFunction(DLL_FreeImageHandle_,"_FreeImage_GetColorType@4"),dib)
EndProcedure
Procedure FreeImage_ConvertTo8Bits(dib)
  ProcedureReturn CallFunctionFast(API_IsFunction(DLL_FreeImageHandle_,"_FreeImage_ConvertTo8Bits@4"),dib)
EndProcedure
Procedure FreeImage_ConvertTo16Bits555(dib)
  ProcedureReturn CallFunctionFast(API_IsFunction(DLL_FreeImageHandle_,"_FreeImage_ConvertTo16Bits555@4"),dib)
EndProcedure
Procedure FreeImage_ConvertTo16Bits565(dib)
  ProcedureReturn CallFunctionFast(API_IsFunction(DLL_FreeImageHandle_,"_FreeImage_ConvertTo16Bits565@4"),dib)
EndProcedure
Procedure FreeImage_ConvertTo24Bits(dib)
  ProcedureReturn CallFunctionFast(API_IsFunction(DLL_FreeImageHandle_,"_FreeImage_ConvertTo24Bits@4"),dib)
EndProcedure
Procedure FreeImage_ConvertTo32Bits(dib)
  ProcedureReturn CallFunctionFast(API_IsFunction(DLL_FreeImageHandle_,"_FreeImage_ConvertTo32Bits@4"),dib)
EndProcedure
Procedure FreeImage_ColorQuantize(dib,Quantize)
  ProcedureReturn CallFunctionFast(API_IsFunction(DLL_FreeImageHandle_,"_FreeImage_ColorQuantize@8"),dib,Quantize)
EndProcedure
Procedure FreeImage_DIB_To_BITMAP(dib)
  Result=0
  If dib=0 : ProcedureReturn 0 : EndIf
  lpBMIH = FreeImage_GetInfoHeader(dib)
  Debug "getinfoheader = " + Str(lpBMIH)
  If lpBMIH=0 : ProcedureReturn 0 : EndIf
  lpBMI = FreeImage_GetInfo(dib)
  Debug "getinfo = " + Str(lpBMI)
  If lpBMI=0 : ProcedureReturn 0 : EndIf
  lpBits = FreeImage_GetBits(dib)
  Debug "getbits = " + Str(lpBits)
  If lpBits=0 : ProcedureReturn 0 : EndIf
  hDC_Screen = GetDC_(GetDesktopWindow_())
  Debug "hDC_Screen = " + Str(hDC_Screen)
  If hDC_Screen=0 : ProcedureReturn 0 : EndIf
  Debug "jetzt CreateDIBitmap_("+ Str(hDC_Screen) + ", " + Str(lpBMIH) + ", " + Str(#CBM_INIT) + "," + Str(lpBits) + "," + Str(lpBMI) + "," + Str(#DIB_RGB_COLORS) + ")"
  Result = CreateDIBitmap_(hDC_Screen, lpBMIH, #CBM_INIT,lpBits,lpBMI,#DIB_RGB_COLORS)
  If Result = 0
    Debug "nu geht nix mehr"
  EndIf
  ReleaseDC_(GetDesktopWindow_(), hDC_Screen)
  ProcedureReturn Result
EndProcedure
Procedure FreeImage_Bitmap_To_DIB(hBitmap)
  BmpInfo.BITMAP
  If hBitmap=0 : ProcedureReturn 0 : EndIf
  If GetObject_(hBitmap, 4+4+4+4+2+2+4, BmpInfo)=0 : ProcedureReturn 0 : EndIf
  TheWidth = BmpInfo\bmWidth
  TheHeight = BmpInfo\bmHeight
  TheBPP = 32
  hDC_Screen = GetDC_(GetDesktopWindow_())
  If hDC_Screen=0 : ProcedureReturn 0 : EndIf
  TempDIB = FreeImage_Allocate(TheWidth, TheHeight, TheBPP,0,0,0)
  If TempDIB=0 : ReleaseDC_(GetDesktopWindow_(),hDC_Screen):ProcedureReturn 0:EndIf
  lpBMI = FreeImage_GetInfo(TempDIB)
  If lpBMI=0 : FreeImage_Free(TempDIB):ReleaseDC_(GetDesktopWindow_(),hDC_Screen):ProcedureReturn 0:EndIf
  lpBits = FreeImage_GetBits(TempDIB)
  If lpBits=0 : FreeImage_Free(TempDIB):ReleaseDC_(GetDesktopWindow_(),hDC_Screen):ProcedureReturn 0:EndIf
  If GetDIBits_(hDC_Screen, hBitmap, 0, TheHeight,lpBits,lpBMI,#DIB_RGB_COLORS)
    ReleaseDC_(GetDesktopWindow_(),hDC_Screen)
    ProcedureReturn TempDIB
  Else
    FreeImage_Free(TempDIB)
    ReleaseDC_(GetDesktopWindow_(),hDC_Screen)
    ProcedureReturn 0
  EndIf
EndProcedure
Procedure FreeImage_GetBitmapWidth(hBitmap)
  BmpInfo.BITMAP
  If hBitmap = 0 : ProcedureReturn 0 : EndIf
  If GetObjectType_(hBitmap) <> #OBJ_BITMAP : ProcedureReturn 0 : EndIf
  If GetObject_(hBitmap, 4+4+4+4+2+2+4, BmpInfo) = 0 : ProcedureReturn 0 : EndIf
  ProcedureReturn BmpInfo\bmWidth
EndProcedure
Procedure FreeImage_GetBitmapHeight(hBitmap)
  BmpInfo.BITMAP
  If hBitmap = 0 : ProcedureReturn 0 : EndIf
  If GetObjectType_(hBitmap) <> #OBJ_BITMAP : ProcedureReturn 0 : EndIf
  If GetObject_(hBitmap, 4+4+4+4+2+2+4, BmpInfo) = 0 : ProcedureReturn 0 : EndIf
  ProcedureReturn BmpInfo\bmHeight
EndProcedure
Global FI_AdrMEM.l
Global FI_IOMEM.FreeImageIO
Procedure FI_ReadMEM(Buffer,Size,count,Handle)
  For c=0 To count-1
    For s=0 To Size-1
      PokeB(Buffer+s,PeekB(FI_AdrMEM+s))
    Next
    FI_AdrMEM + Size
    Buffer + Size
  Next
  ProcedureReturn count
EndProcedure
Procedure FI_WriteMEM(Buffer,Size,count,Handle)
  ProcedureReturn Size
EndProcedure
Procedure FI_SeekMEM(Handle,offset,origin)
  If origin = #SEEK_SET
    FI_AdrMEM = Handle + offset
  Else
    FI_AdrMEM + offset
  EndIf
  ProcedureReturn 0
EndProcedure
Procedure FI_TellMEM(Handle)
  ProcedureReturn (FI_AdrMEM - Handle)
EndProcedure
FI_IOMEM\read_proc  = @FI_ReadMEM()
FI_IOMEM\write_proc = @FI_WriteMEM()
FI_IOMEM\tell_proc  = @FI_TellMEM()
FI_IOMEM\seek_proc  = @FI_SeekMEM()
#FIC_noconvert=0
#FIC_8bitsWU=1
#FIC_8bitsNN=2
#FIC_16bits555=3
#FIC_16bits565=4
#FIC_24bits=5
#FIC_32bits=6
#FIC_bw=7
Procedure FI_SetClipboard(ImageNR)
  ClearClipboard()
  dib=copyimage_(ImageID(ImageNR),#IMAGE_BITMAP,0,0,#LR_COPYRETURNORG)
  SetClipboardImage(dib)
EndProcedure
Procedure FI_GetClipboard(ImageNR)
  Result=0
  ImageID=GetClipboardImage(ImageNR)
  If ImageID>0
    Result=CreateImage(ImageNR,FreeImage_GetBitmapWidth(ImageID),FreeImage_GetBitmapHeight(ImageID))
    StartDrawing(ImageOutput(ImageNR))
    DrawImage(ImageID,0,0)
    StopDrawing()
  EndIf
  ProcedureReturn Result
EndProcedure
Procedure FI_SaveImage(ImageNR,file$,convert,flags)
  Result=0
  ImageFormat=FreeImage_GetFIFFromFormat(GetExtensionPart(file$))
  If ImageFormat<>#FIF_UNKNOWN
    If FreeImage_FIFSupportsWriting(ImageFormat)
      If GetExtensionPart(file$)=""
        file$+"."+StringField(FreeImage_GetFIFExtensionList(ImageFormat),1,",")
      EndIf
      dib=FreeImage_Bitmap_To_DIB(ImageID(ImageNR))
      If dib
        Select convert
          Case #FIC_8bitsWU
            If FreeImage_FIFSupportsExportBPP(ImageFormat,8)
              dibx=FreeImage_ConvertTo24Bits(dib)
              dib2=FreeImage_ColorQuantize(dibx,#FIQ_WUQUANT)
            EndIf
          Case #FIC_8bitsNN
            If FreeImage_FIFSupportsExportBPP(ImageFormat,8)
              dibx=FreeImage_ConvertTo24Bits(dib)
              dib2=FreeImage_ColorQuantize(dibx,#FIQ_NNQUANT)
            EndIf
          Case #FIC_16bits555
            If FreeImage_FIFSupportsExportBPP(ImageFormat,16)
              dib2=FreeImage_ConvertTo16Bits555(dib)
            EndIf
          Case #FIC_16bits565
            If FreeImage_FIFSupportsExportBPP(ImageFormat,16)
              dib2=FreeImage_ConvertTo16Bits565(dib)
            EndIf
          Case #FIC_24bits
            If FreeImage_FIFSupportsExportBPP(ImageFormat,24)
              dib2=FreeImage_ConvertTo24Bits(dib)
            EndIf
          Case #FIC_32bits
            If FreeImage_FIFSupportsExportBPP(ImageFormat,32)
              dib2=FreeImage_ConvertTo32Bits(dib)
            EndIf
          Case #FIC_bw
            If FreeImage_FIFSupportsExportBPP(ImageFormat,8)
              dib2=FreeImage_ConvertTo8Bits(dib)
            EndIf
        EndSelect
        If dibx :FreeImage_Free(dibx):EndIf
        If dib2
          FreeImage_Free(dib)
          dib=dib2
        EndIf
        Result=FreeImage_Save(ImageFormat,dib,file$,flags)
        FreeImage_Free(dib)
      EndIf
    EndIf
  EndIf
  ProcedureReturn Result
EndProcedure
Procedure FI_LoadImage(ImageNR,in$,flags)
  Result=0
  ImageFormat=FreeImage_GetFileType(in$)
  If ImageFormat<>#FIF_UNKNOWN
    dib=FreeImage_Load(ImageFormat,in$,flags)
    If dib
      width=FreeImage_GetWidth(dib)
      height=FreeImage_GetHeight(dib)
      bitmap=FreeImage_DIB_To_BITMAP(dib)
      If bitmap
        Result=CreateImage(ImageNR,width,height)
        StartDrawing(ImageOutput(ImageNR))
        DrawImage(bitmap,0,0)
        StopDrawing()
        DeleteObject_(bitmap)
      EndIf
      FreeImage_Free(dib)
    EndIf
  EndIf
  ProcedureReturn Result
EndProcedure
Procedure FI_CatchImage(ImageNR,adr,flags)
  FI_AdrMEM=adr
  Result=0
  ImageFormat=FreeImage_GetFileTypeFromHandle(@FI_IOMEM.FreeImageIO,adr)
  If ImageFormat<>#FIF_UNKNOWN
    FI_AdrMEM=adr
    dib=FreeImage_LoadFromHandle(ImageFormat,@FI_IOMEM.FreeImageIO,adr,flags)
    If dib
      width=FreeImage_GetWidth(dib)
      height=FreeImage_GetHeight(dib)
      bitmap=FreeImage_DIB_To_BITMAP(dib)
      If bitmap
        Result=CreateImage(ImageNR,width,height)
        StartDrawing(ImageOutput(ImageNR))
        DrawImage(bitmap,0,0)
        StopDrawing()
        DeleteObject_(bitmap)
      EndIf
      FreeImage_Free(dib)
    EndIf
  EndIf
  ProcedureReturn Result
EndProcedure
Gruss Rico
Benutzeravatar
Kuno
Beiträge: 3
Registriert: 30.10.2010 19:27

Re: CreateDIBitmap und FreeImage.dll

Beitrag von Kuno »

Hallo Rico bin gerade auf Dein Problem gestossen ,und ich Denke eine lösung gefunden zu haben, zwar Spät aber besser als nie.
Wenn Du die Bitmap nicht mehr brauchst, solltest Du sie löschen das geht am besten mit DeleteObject_(handle to graphic object)

Füge folgendes in die .pbi Datei ein

Code: Alles auswählen

Global DiB_Bitmab_altHandel.l = 0
und dann ändere FreeImage_DIB_To_BITMAP(dib) in

Code: Alles auswählen

Procedure FreeImage_DIB_To_BITMAP(dib)
  If DiB_Bitmab_altHandel>0
   DeleteObject_(DiB_Bitmab_altHandel) 
  EndIf	
  Result=0
  If dib=0 : ProcedureReturn 0 : EndIf
  lpBMIH = FreeImage_GetInfoHeader(dib)
  Debug "getinfoheader = " + Str(lpBMIH)
  If lpBMIH=0 : ProcedureReturn 0 : EndIf
  lpBMI = FreeImage_GetInfo(dib)
  Debug "getinfo = " + Str(lpBMI)
  If lpBMI=0 : ProcedureReturn 0 : EndIf
  lpBits = FreeImage_GetBits(dib)
  Debug "getbits = " + Str(lpBits)
  If lpBits=0 : ProcedureReturn 0 : EndIf
  hDC_Screen = GetDC_(GetDesktopWindow_())
  Debug "hDC_Screen = " + Str(hDC_Screen)
  If hDC_Screen=0 : ProcedureReturn 0 : EndIf
  Debug "jetzt CreateDIBitmap_("+ Str(hDC_Screen) + ", " + Str(lpBMIH) + ", " + Str(#CBM_INIT) + "," + Str(lpBits) + "," + Str(lpBMI) + "," + Str(#DIB_RGB_COLORS) + ")"
  
  Result = CreateDIBitmap_(hDC_Screen, lpBMIH, #CBM_INIT,lpBits,lpBMI,#DIB_RGB_COLORS)
  If Result = 0
    Debug "nu geht nix mehr"
  Else
  ; DeleteObject_(DiB_Bitmab_altHandel)
   DiB_Bitmab_altHandel = Result  
   Debug  DiB_Bitmab_altHandel 
  EndIf
  ReleaseDC_(GetDesktopWindow_(), hDC_Screen)
  ProcedureReturn Result
EndProcedure
bei mir funzt es jedenfalls

:D :D :D :D :D :D :D :D
Antworten