Grafikmaße ermitteln, ohne die Grafik zu laden

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

koril-k

Betreff: Grafikmaße ermitteln, ohne die Grafik zu laden

BeitragFr, Jul 02, 2010 17:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie kann ich die Breite und Höhe einer Grafik ermitteln, ohne die ganze Grafik zu laden? Hintergrund: Meine Funktion, die LoadAnimImage gleicht, soll zu einer vorgegebenen Grafik (in der mehrere gleichbreite Teilbilder gespeichert sind) mit Hilfe der Breite der Teilbilder (die ihr bekannt ist) und mit der Gesamtbreite der Grafik (die herauszufinden ich mich schwer tue) die Anzahl der Teilbilder der Grafik berechnen. Natürlich könnte ich die Grafik laden und dann die ImageWidth-Funktion verwenden und dann die Grafik (mittels Null-Setzen) wieder löschen, aber das wäre ja irrwitziger Mehraufwand. In den Windows-Dateieigenschaften gibt es eine Registerkarte "Details", wo Breite und Höhe einer Grafik gespeichert sind. Wie komme ich da ran?

Xeres

Moderator

BeitragFr, Jul 02, 2010 18:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Dafür musst du das Format verstehen, dann kannst du das aus der Datei auslesen. Nachschlagen z.B. Windows Bitmap (wiki), ggf. unter www.wotsit.org/ und für jedes Format implementieren.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

ComNik

BeitragFr, Jul 02, 2010 18:53
Antworten mit Zitat
Benutzer-Profile anzeigen
[EDIT:]Erst lesen, dann posten...[/EDIT]
WIP: Vorx.Engine
  • Zuletzt bearbeitet von ComNik am Fr, Jul 02, 2010 23:45, insgesamt einmal bearbeitet

BladeRunner

Moderator

BeitragFr, Jul 02, 2010 19:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Du könntest auch das bild durch sein 'getiletes' Pendant ersetzen, und da BMax aus Pixmaps laden kann wäre das auch recht flott.
Beispiel:
Code: [AUSKLAPPEN]
SuperStrict

Local img:TImage = LoadImage("DateideinerWahl.png")
Local x:Int = img.width
DebugLog "WIDTH: " + x
img = LoadAnimImage(img.pixmaps[0] , x / 2 , 32 , 0 , 2) 'laden wir das bild mal als 2 Tiles
x = img.width
DebugLog "WIDTH after loadanimimage: " + x


Theoretischerweise sollte die alte Imagedatei automatisch aus dem Speicher verbannt werden, nachgeprüft habe ich das allerdings nicht.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

koril-k

BeitragFr, Jul 02, 2010 20:20
Antworten mit Zitat
Benutzer-Profile anzeigen
@xeres: Das Bitmap-Dateiformat sieht sehr simpel aus, allerdings scheint der Aufbau von PNG- und JPG-Dateien (die ich hauptsächlich nutze) eine ausführliche Einarbeitung zu benötigen, was mir mein Problem nicht wert ist.

@ComNik: Genau das habe ich in meinem Post als Lösung ausgeschlossen, weil das Laden und Löschen einer Grafik, nur um seine Maße zu ermitteln, ein zu drastischer Effizienzverlust ist.

@BladeRunner: Deine Lösung würde mir helfen, wenn ich die Grafik auch sogleich benötigen würde. In meinem speziellen Problem bereite ich aber lediglich Informationen für die Grafiken vor (z.B. deren Teilbilder-Anzahl) und mit diesen Infos wird schon gearbeitet, bevor (und nachdem) die Grafik im Speicher war/ist. Der Grund dafür ist, dass ich aus Speichersparsamkeit Grafiken dynamisch laden (und freigeben) möchte, wenn sie benötigt werden.

Ich werde wohl meinen Programmfluss etwas abändern, sodass ich ohne die Information über die Anzahl der Teilbilder einer Grafik auskomme, solange diese nicht geladen ist und wenn ich die Grafik (und Informationen) dann tatsächlich brauche, werde ich sie nach BladeRunners Variante laden. Danke für die Hilfe!

DaysShadow

BeitragFr, Jul 02, 2010 21:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Man nehme diese Seite: http://mindprod.com/jgloss/png.html, öffne BlitzMax und wendet an was man liest Wink Suchwort war btw einfach nur "png header"

BlitzMax: [AUSKLAPPEN]
Function GetWidthPNG:Int( file:String )

Local stream:TStream = OpenStream( file )

Local width:Int

stream.Seek( 16 )

width = stream.ReadByte( ) Shl 24 + stream.ReadByte( ) Shl 16 + stream.ReadByte( ) Shl 8 + stream.ReadByte( )

stream.Close( )

Return width

End Function

Function GetHeightPNG( file:String )

Local stream:TStream = OpenStream( file )

Local height:Int

stream.Seek( 20 )

height = stream.ReadByte( ) Shl 24 + stream.ReadByte( ) Shl 16 + stream.ReadByte( ) Shl 8 + stream.ReadByte( )

stream.Close( )

Return height

End Function
Blessed is the mind too small for doubt
  • Zuletzt bearbeitet von DaysShadow am Fr, Jul 02, 2010 23:04, insgesamt einmal bearbeitet
 

FWeinb

ehemals "ich"

BeitragFr, Jul 02, 2010 21:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Oder man sucht hier im Forum und findet einen Eintrag im BB Code Archive:https://www.blitzforum.de/foru...hp?t=30177 sollte recht einfach in BMax Übertragbar sein.

MfG
ich
"Wenn die Menschen nur über das sprächen, was sie begreifen, dann würde es sehr still auf der Welt sein." Albert Einstein (1879-1955)
"If you live each day as if it was your last, someday you'll most certainly be right." Steve Jobs

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group