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:

Freeimage Jpeg, Png, Tif + Bmp Bilder anzeigen (Lösung)

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
michaelblasin



Anmeldungsdatum: 09.11.2010
Beiträge: 24

BeitragVerfasst am: 29.05.2019, 10:08    Titel: Freeimage Jpeg, Png, Tif + Bmp Bilder anzeigen (Lösung) Antworten mit Zitat

Hallo, 29-05-2019

….. Wer sich für ‚Freeimage’ interessiert.

1. Mein ‚Png’ Bild ist verzerrt, weil ‚FreeImage_Load’ die Bildzeile (also die X-Achse) nicht auf ein Vielfaches von 16 Bytes je Zeile anlegt. (das macht IMAGECREATE so)
Das passiert also mit jedem Bild, in dem die Bildzeile nicht ein Vielfaches von 16 Bytes ist. Man muß das also nur die Bildzeile entsprechend vergrößern oder verkleinern, falls sie nicht ein Vielfaches von 16 Bytes ist.
Die meisten Bilder werden von Kameras bereits auf 16 Bytes per Zeile angelegt, aber nicht von meinem Scanner im Falle eines ‚Png’ Bilds.

2. Im Forum gibt es einige Beiträge über das Vergrößern und Verkleinern von Bildern. In ‚Freeimage’ gibt es die Funktion FreeImage_Rescale(Dib32, Neue x Pixel , Neue y Pixel, FILTER_BOX) >> siehe Handbuch.
Ich arbeite viel damit, die Funktion läuft einwandfrei für alle Bildtiefen.

Mein Beitrag vom 12-05-2019 lautete
Es gibt ein Beispiel im Tutorial Grafiken mit der FreeImage-Bibliothek laden von csde_rats

Ich habe die Beispielbilder auf meinem Scanner mit 24 Bit erstellt. Die ‚Tif’, die ‚Bmp’ und die ‚Jpeg’ Dateien entsprechen der Vorlage. Die ‚Png’ Bilder sind verzerrt, in etwa um 45 Grad gedreht.
Das Problem hat mit der ‚Jpeg’ Datei hat sich gelöst (siehe meinen Beitrag vom 10-05-2019).

Die ‚Png’ Datei ist zur Zeit kein Problem. Mich würde nur interessieren, woran es liegen könnte, daß das ‚Png’ Bild verzerrt ist.
Gruss Michael

Freeimage Jpeg, Png, Tif + Bmp Bilder anzeigen (Lösung)
***********************************************
Code:
'Die Bildzeile wird auf 16 Bytes angelegt.
#Include "Freeimage393.bi"
#include "crt.bi"
    screenres 1000, 800, 32

    Function GetImage (Byval File_1 As String, Format_1 as integer, FormAttrib_1 as integer) As Any Ptr
    Dim Dib As FIBITMAP Ptr
    Dim Dib32 as FIBITMAP Ptr
    Dim SprWidth As Integer
   Dim SprWidthSprite As Integer
    Dim SprHeight As Integer
    Dim Sprite As Any Ptr
    Dim Bits As Any Ptr
   Dim As Integer SprBytespp, intVal, x, y

    '  Bild laden:
    Dib = FreeImage_Load(Format_1, File_1, FormAttrib_1)
    ' Wenn ein Fehler aufgetreten ist, hat der Device Context den Wert 0
    If Dib = 0 Then Return 0

    ' Die Bilddaten werden von FreeImage auf den Kopf gestellt...
    FreeImage_FlipVertical Dib

    ' Ab hier wird mit 32 Bit Farbtiefe gearbeitet, funktioniert aber auch mit anderen Bildtiefen
    Dib32 = FreeImage_ConvertTo32Bits(Dib)
   SprBytespP = FreeImage_GetBpp(Dib32) / 8  'Die Funktion gibt die Anzahl der Bits je Pixel, nicht der Bytes
    SprWidth = FreeImage_GetWidth(Dib32)
    SprWidthSprite = (FreeImage_GetWidth(Dib32) + (16 / SprBytespp) - 1) AND -16 / SprBytespp
    SprHeight = FreeImage_GetHeight(Dib32)
    Sprite = ImageCreate(SprWidthSprite, SprHeight)
    Bits = FreeImage_GetBits(Dib32)
   
   IF SprWidthSprite <> SprWidth THEN GOTO GetImage20
    ' Die Bilddaten kopieren, wenn die Zeile durch 16 teilbar ist

    MemCpy CPtr(Zstring Ptr, Sprite) + 32, Bits, SprWidth * SprHeight * SprBytespP
    ' Folgende Version mit alten FreeBASIC-Versionen oder -lang deprecated verwenden:
    ' MemCpy CPtr(Zstring Ptr, Sprite) + 4, Bits, SprWidth * SprHeight * SprBytespP

GetImage10:
    ' Speicher wieder freigeben
    FreeImage_Unload(Dib)
    FreeImage_Unload(Dib32)

    Return Sprite

GetImage20:
    ' Die Bilddaten kopieren, wenn die Zeile nicht durch 16 teilbar ist
    FOR y = 1 TO SprHeight
      FOR x = 1 TO SprWidth
       intVal = PEEK(INTEGER, Bits)
       Bits += SprBytespP
       PSET Sprite, (x, y), intVal
      NEXT x
     NEXT y
     GOTO GetImage10
   
End Function
'Dazu gleich ein paar Beispiele:

Dim Pics(0 to 3) As Any Ptr
Pics(0) = GetImage("FreeImageBilderladen_EinJPEG-24Bit-VomScanner.jpg", FIF_JPEG, JPEG_DEFAULT)
Pics(1) = GetImage("FreeImageBilderladen_EinPng-SnippingTool.png", FIF_PNG, PNG_DEFAULT)
Pics(2) = GetImage("FreeImageBilderladen_EinTIFF-24Bit-VomScanner.tif", FIF_TIFF, TIFF_DEFAULT)
Pics(3) = GetImage("FreeImageBilderladen_EinBmp-24Bit-VomScanner.BMP", FIF_BMP, BMP_DEFAULT)

For n As Integer = LBound(Pics) To UBound(Pics)
  Cls
  IF Pics(n) = 0 THEN PRINT "Bild nicht gefunden, lfd.Nummer ", n: SLEEP: END
  Put(0,0), Pics(n), PSet
  PRINT n
  Sleep
Next n
SLEEP
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4255
Wohnort: ~/

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

Vielen Dank für die Zusammenstellung, ich werde mal etwas damit herum experimentieren. Für PNG verwende ich bisher eine andere Funktion, aber ich kann noch was für andere Bildformate brauchen, und die Speicherung als PNG will ich mir auch mal ansehen.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4255
Wohnort: ~/

BeitragVerfasst am: 09.06.2019, 12:01    Titel: Antworten mit Zitat

Nachdem ich mich jetzt mal rangetraut und dazu noch etwas recherchiert habe, bin ich im Portal auf einen Beitrag von Volta gestoßen - vielleicht kannst du auch was damit anfangen. Er hat das mit dem Pitch bereits gelöst.

https://www.freebasic-portal.de/tutorials/fbimage-freeimagedll-33.html
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
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 -> Allgemeine Fragen zu FreeBASIC. 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