Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Probleme mit FreeImage.dll

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Bibliotheken
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 17.07.2009, 10:49    Titel: Probleme mit FreeImage.dll Antworten mit Zitat

Hallo Leute,

nachdem ich mich wieder zurückgemeldet hab, darf ich ja auch eine Frage stellen, oder ? zwinkern

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
tim.vogt



Anmeldungsdatum: 01.03.2009
Beiträge: 56

BeitragVerfasst am: 17.07.2009, 11:16    Titel: Antworten mit Zitat

volta hat Folgendes geschrieben:
Hi,
FreeImage habe ich lange nicht mehr benutzt.
Mit den Versionen 3.10 und 3.11 hatte ich keine guten Erfahrungen gemacht, was die Anbindung an FB betrifft.
Hier ( http://www.freebasic-portal.de/index.php?s=download&id=89 ) findest du die Version 3.9.3 mit der auch die Beispiele arbeiten.


Quelle: http://forum.qbasic.at/viewtopic.php?t=6513&highlight=freeimage+neuste
_________________
"Nichts ist wahrhaftig und alles ist erlaubt."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 17.07.2009, 13:33    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 17.07.2009, 15:20    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 17.07.2009, 18:50    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 17.07.2009, 19:21    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
qbasicfan
gesperrt (Wird das nicht langweilig?)


Anmeldungsdatum: 29.07.2009
Beiträge: 45

BeitragVerfasst am: 29.07.2009, 12:58    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 29.07.2009, 13:00    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
qbasicfan
gesperrt (Wird das nicht langweilig?)


Anmeldungsdatum: 29.07.2009
Beiträge: 45

BeitragVerfasst am: 29.07.2009, 13:03    Titel: Antworten mit Zitat

Das ist das Problem, wie wird dieses Dib1 angezeigt?

hmm...

mfg
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 29.07.2009, 13:19    Titel: Antworten mit Zitat

Du musst es in ein FBImage umwandeln, damit du es mit PUT anzeigen kannst, dazu hat Volta eine geniale Konvertierungsmethode geschrieben: http://www.freebasic-portal.de/index.php?s=tutorials&id=33&seite=1
_________________
Elektronik und Programmieren
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
qbasicfan
gesperrt (Wird das nicht langweilig?)


Anmeldungsdatum: 29.07.2009
Beiträge: 45

BeitragVerfasst am: 29.07.2009, 14:18    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 29.07.2009, 14:24    Titel: Antworten mit Zitat

Nimm lieber die FreeImage_RotateEx, da kannst du alles mögliche einstellen.
Schau dir auch mal die Dokumentation von freeimage an:

http://sourceforge.net/projects/freeimage/files/Source%20Documentation/3.12.0/FreeImage3120.pdf/download

Gruß
Jens
_________________
Elektronik und Programmieren
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
qbasicfan
gesperrt (Wird das nicht langweilig?)


Anmeldungsdatum: 29.07.2009
Beiträge: 45

BeitragVerfasst am: 29.07.2009, 15:20    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Bibliotheken Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz