|
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 |
michaelblasin
Anmeldungsdatum: 09.11.2010 Beiträge: 38
|
Verfasst am: 29.05.2019, 10:08 Titel: Freeimage Jpeg, Png, Tif + Bmp Bilder anzeigen (Lösung) |
|
|
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 |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 29.05.2019, 21:19 Titel: |
|
|
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 |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 09.06.2019, 12:01 Titel: |
|
|
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 |
|
|
|
|
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.
|
|