|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
jb
Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 17.07.2009, 11:49 Titel: Probleme mit FreeImage.dll |
|
|
Hallo Leute,
nachdem ich mich wieder zurückgemeldet hab, darf ich ja auch eine Frage stellen, oder ?
Ich möchte in meinem aktuellen Projekt beliebige Bilderdaten laden (BMP, GIF, JPG, PNG sollten es schon sein) und habe mir gedacht, dass die freeimage.dll doch bestimmt gut dafür geeignet ist.
Pustekuchen. Ich habe freeBASIC 0.20.0b, die neueste Compiler-Version, aber alle Beispiele von freebasic-portal.de zur freeimage.dll scheitern. An Versionen von freeimage habe ich die neueste (3.10 ist das gleube ich) ausprobiert, und auch die Version, die Sebastian auf freebasic-portal.de hochgeladen hat - beides klappt nicht.
Als Editor habe ich JellyFB, nicht der beste, ich weiß, aber auch nicht so überladen wie FBEdit. Das Problem: JellyFB zeigt mir keinen Fehler an, erstellt aber keine .EXE. Das ist bei allen Programmschnipsel zur Freeimage so.
Die DLL ist im selben Verzeichnis, was muss ich sonst beachten? War da nicht noch was mit der Befehlszeile des Compilers, oder ist das nur, wenn man selbst ne Lib erstellen will? Mensch, ist so lange her.
Gruß
Jens _________________ Elektronik und Programmieren |
|
Nach oben |
|
|
tim.vogt
Anmeldungsdatum: 01.03.2009 Beiträge: 56
|
|
Nach oben |
|
|
jb
Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 17.07.2009, 14:33 Titel: |
|
|
Hallo,
danke für die Info, mit dieser Lib hatte ich es ja ausprobiert (Ich dachte, Sebastian hätte die hochgeladen, sorry fürs Missverständnis).
Und siehe da: Der Code Mit Voltas FIBitmap2FBImage klappt, die Sache läuft.
ABER: Nur in FBIde. Nicht in JellyFB. Warum?
/edit: Hat sich erledigt. Es fehlte eine Include-Zeile für die MemCpyFunktion, und Jelly hat das wie FBIde nicht angezeigt. Jetzt steig ich auf FBEdit um. _________________ Elektronik und Programmieren |
|
Nach oben |
|
|
jb
Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 17.07.2009, 16:20 Titel: |
|
|
Oder doch nicht, jetzt klappt das Skalieren nicht. Warum? Code: |
Bild = FreeImage_Load(FIF_JPEG, "testbild.jpg", JPEG_DEFAULT)
dim as integer WidthX, WidthY, Faktor, Erg
WidthX = FreeImage_GetWidth(Bild)
WidthY = FreeImage_GetHeight(Bild)
Faktor = WidthY / 200
Erg = FreeImage_Rescale(Bild, WidthX / Faktor, 200, FILTER_BILINEAR)
buffer = FIBitmap2FBImage(Bild)
put (0, 0), Bild
|
Es ist keine Größenänderung sichtbar, das Bild wird in Originalgröße in den FBImage-Puffer geschrieben... _________________ Elektronik und Programmieren |
|
Nach oben |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 17.07.2009, 19:50 Titel: |
|
|
Die Funktion FreeImage_Rescale gibt einen Pointer auf ein FIBITMAP (Dib2) zurück.
Faktor sollte mindestens vom Format 'Single' sein.
Code: | #Include Once "FreeImage393.bi"
Screen 18,32
Dim As FIBITMAP Ptr Dib1, Dib2
Dim As Integer WidthX, WidthY
Dim As Single Faktor
Dib1 = FreeImage_Load(FIF_PNG, "test32.png", 0)
WidthX = FreeImage_GetWidth(Dib1)
WidthY = FreeImage_GetHeight(Dib1)
Faktor = WidthY / 200
Dib2 = FreeImage_Rescale(Dib1, WidthX / Faktor, 200, FILTER_BILINEAR)
FreeImage_Save(FIF_BMP, Dib2, "testklein.bmp", 0)
FreeImage_Unload(Dib2)
FreeImage_Unload(Dib1)
BLoad "testklein.bmp"
Locate 27,1
Print "FreeImage Version "; *FreeImage_GetVersion
Sleep |
_________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
|
jb
Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 17.07.2009, 20:21 Titel: |
|
|
Danke, Volta. Habe ich - nicht gelogen - auch vor ca. 1 Stunde gemerkt. Saß heute bestimm 2h daran und hab geschaut ^^ Nene. Aber durch solche Fehler lernt man.
Der Faktor war nur vom Test her int, jetzt ist er ein double.
Danke,
Jens _________________ Elektronik und Programmieren |
|
Nach oben |
|
|
qbasicfan gesperrt (Wird das nicht langweilig?)
Anmeldungsdatum: 29.07.2009 Beiträge: 45
|
Verfasst am: 29.07.2009, 13:58 Titel: |
|
|
Ist sehr interessant mit dem Freeimage.
Da ist ja auch eine "Dib1 = FreeImage_RotateClassic(Dib2, 90)" Rotierroutine drin.
Wer kann mir mal helfen, das dieses Bild jetzt nicht abgespeichert wird ,sondern einfach rotierend in 1-Gradschritten auf dem Screen dargestellt wird.
Danke.
mfg |
|
Nach oben |
|
|
jb
Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 29.07.2009, 14:00 Titel: |
|
|
Einfach immer diese Funktion in eine Schleife, und immer das Dib1 dann anzeigen. Am Ende der Schleife dann den Winkel erhöhen.
Gruß
Jens _________________ Elektronik und Programmieren |
|
Nach oben |
|
|
qbasicfan gesperrt (Wird das nicht langweilig?)
Anmeldungsdatum: 29.07.2009 Beiträge: 45
|
Verfasst am: 29.07.2009, 14:03 Titel: |
|
|
Das ist das Problem, wie wird dieses Dib1 angezeigt?
hmm...
mfg |
|
Nach oben |
|
|
jb
Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
|
Nach oben |
|
|
qbasicfan gesperrt (Wird das nicht langweilig?)
Anmeldungsdatum: 29.07.2009 Beiträge: 45
|
Verfasst am: 29.07.2009, 15:18 Titel: |
|
|
JB , danke für den Hinweis.
Ich drehe jetzt das Bild und bringe es mit "Put" auf den Screen.
Das Bild hat 256x256 Pixel.
Warum eiert es so rum und dreht nicht um den Mittelpunkt.
Oder gibt es ein Freeimage-Befehl für den Bezugspunkt.
Kann das mal einer Testen?
Code: |
#Include Once "FreeImage393.bi"
Declare Sub mmxcopy Cdecl Alias "fb_hMemCpyMMX" _
(ByVal dest As Any Ptr, ByVal src As Any Ptr, ByVal size As Integer)
Function FBImage2FIBitmap(ByVal Image As Any Ptr) As FIBITMAP Ptr
Dim As FIBITMAP Ptr Dib
Dim As UInteger Ptr buffer = Image 'erleichtert den Imageheader auszuwerten
Dim As UInteger bpp, breit, hoch, pitch
If buffer[0]=7 Then 'neuer Header
bpp = buffer[1] 'dies sind BYTE per Pixel
If bpp <> 4 Then Return NULL 'nur im 32-Bit Format
breit = buffer[2] 'Anzahl Pixel (4 Byte) pro Zeile
hoch = buffer[3]
pitch = buffer[4] 'Anzahl Byte pro Zeile (.align 16)
Image += 32 '+ Sizeof FBImageHeader
Dib = FreeImage_Allocate(breit, hoch, bpp *8) 'hier Bit per Pixel angeben
Dim As UByte Ptr FIpixel = FreeImage_GetBits(Dib)
For i As Integer = 1 To hoch ' Die Bilddaten zeilenweise kopieren
mmxcopy FIpixel, Image, breit * bpp
FIpixel+= (breit * bpp)
Image += pitch 'sonst verzerrt das Bild
Next
Else 'alter Header
bpp = buffer[0] And 7 'dies sind BYTE per Pixel
If bpp <> 4 Then Return NULL 'nur im 32-Bit Format
breit = (buffer[0] And &Hfff8) Shr 3
hoch = (buffer[0] And &Hffff0000) Shr 16
Dib = FreeImage_Allocate(breit, hoch, bpp *8) 'hier Bit per Pixel angeben
mmxcopy FreeImage_GetBits(Dib), Image +4 , breit * hoch * bpp 'Bilddaten kopieren
End If
FreeImage_FlipVertical(Dib) 'Bild steht sonst auf dem Kopf
Function = Dib
End Function
Function FIBitmap2FBImage(ByVal Dib As FIBITMAP Ptr ) As Any Ptr
Dim As UInteger bpp, breit, hoch, pitch
FreeImage_FlipVertical(Dib) 'Bild steht sonst auf dem Kopf
Dib = FreeImage_ConvertTo32Bits(Dib)'nur im 32-Bit Format
breit = FreeImage_GetWidth(Dib)
hoch = FreeImage_GetHeight(Dib)
Dim As Any Ptr Image = ImageCreate(breit, hoch), ximage = Image
Dim As UInteger Ptr buffer = Image 'erleichtert den Imageheader auszuwerten
Dim As UByte Ptr FIpixel = FreeImage_GetBits(Dib)
If buffer[0]=7 Then 'neuer Header
bpp = buffer[1] 'dies sind BYTE per Pixel
If bpp <> 4 Then Return NULL 'nur im 32-Bit Format
pitch = buffer[4] 'Anzahl Byte pro Zeile (.align 16)
ximage += 32 '+ Sizeof FBImageHeader
For i As Integer = 1 To hoch ' Die Bilddaten zeilenweise kopieren
mmxcopy ximage, FIpixel, breit * bpp
FIpixel+= (breit * bpp)
ximage += pitch 'sonst verzerrt das Bild
Next
Else 'alter Header
bpp = buffer[0] And 7 'dies sind BYTE per Pixel
If bpp <> 4 Then Return NULL 'nur im 32-Bit Format
mmxcopy ximage +4, FIpixel, breit * hoch * bpp 'Bilddaten kopieren
End If
FreeImage_Unload(Dib)
Function = Image
End Function
Screen 19,32
Dim As FIBITMAP Ptr Dib8bit ,Dib1,bild
Dim zz As Integer
bild = ImageCreate(256,256, RGB(255,0,255))
Dib8bit= FreeImage_Load(FIF_BMP, "test-put.bmp")
For zz=0 To 200 Step 5
Sleep 10
Dib1 = FreeImage_RotateClassic(Dib8bit,zz)
bild = FIBitmap2FBImage(Dib1)
Put (100,100), bild,Trans
Next
FreeImage_Unload(Dib8bit)
FreeImage_Unload(Dib1)
Sleep
|
|
|
Nach oben |
|
|
jb
Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
|
Nach oben |
|
|
qbasicfan gesperrt (Wird das nicht langweilig?)
Anmeldungsdatum: 29.07.2009 Beiträge: 45
|
Verfasst am: 29.07.2009, 16:20 Titel: |
|
|
Jup , danke, sieht schon mal gut aus.
Jetzt rotiert das Bild in der Mitte.
Ich hab ein Bild 128x128 Pixel.
Das Bild wird mit Freeimgage auch nur in diesem Bereich gedreht, den das Bild hat, bei 45 Grad zb sind die Ecken verschwunden.
Jetzt muss ich einen Befehl finden von Freebasic oder Freeimage, das das Bild mittig in einem anderen Imagebereich liegt, wo die Kantenlänge so lang ist wie die Diagonale des Bildes(Objekt), somit werden die Ecken des Bildes dann nicht mehr abgeschnitten.
Danke.
mfg
Code: |
For zz=0 To 200 Step 5
Sleep 100
Dib1 = FreeImage_RotateEx (Dib8bit,zz,0,0,64,64,1)
bild = FIBitmap2FBImage(Dib1)
Put (100,100), bild,Trans
Next
|
|
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|