Seekfile->warum offset angabe?

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

hamztata

Betreff: Seekfile->warum offset angabe?

BeitragSa, März 14, 2009 13:50
Antworten mit Zitat
Benutzer-Profile anzeigen
hier mal der code.
ich grübel gerade, warum dort der offset abgefragt wird und nicht nur die position verschoben wird.
seeked wird im weiteren verlauf nicht mehr aufgerufen...

Code: [AUSKLAPPEN]
If ImageInfo_Type = imgtype_PNG Then
      seeked = SeekFile(ImageFile, 16)      
      ImageInfo_Width = Swap32(ReadInt(ImageFile))
      ImageInfo_Height = Swap32(ReadInt(ImageFile))            
      Return True
   EndIf   

BladeRunner

Moderator

BeitragSa, März 14, 2009 13:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Sag mal, wie sollen wir das anhand eines Codebrockens denn wissen?
Ohne explizite Angabe woher der Code stammt, was er macht und vor allem im Idealfall den gesamten Code wird dir diese Frage niemand beantworten können.
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
 

hamztata

BeitragSa, März 14, 2009 14:09
Antworten mit Zitat
Benutzer-Profile anzeigen
na wenns denn sein muss, obwohl ich ja geschrieben habe, daß die variable seeked nicht mehr vorkommt....
wollte nur wissen, wozu der offset denn dann da ist...?

beim png auslesen unten ists.


Code: [AUSKLAPPEN]
;Image type constants
Const imgtype_Unknown = 0
Const imgtype_BMP = 1
Const imgtype_PNG = 2
Const imgtype_JPEG = 3
Const imgtype_TGA = 4
Const imgtype_DDS = 5

;Globals

Global ImageInfo_Type = imgtype_Unknown
Global ImageInfo_Width
Global ImageInfo_Height
Global ImageInfo_Depth

;User functions

Function ImageInfo_ReadFile(FileName$) 
   If FileType(FileName)<>1 Return   
   
   ;Init 
   ImageInfo_Type = imgtype_Unknown
   ImageInfo_Width = 0
   ImageInfo_Height = 0
   ImageInfo_Depth = 0
 
   Buffer = CreateBank(4) 
   ImageFileSize = FileSize(FileName)
   
   If ImageFileSize<3 Then
      FreeBank(Buffer)
      Return
   EndIf
   
   ImageFile = ReadFile(FileName) 
 
   ;Start comparsion
   ReadBytes(Buffer, ImageFile, 0, 4)
 
   ;Check PNG
   If (PeekByte(Buffer,0) = 137) And (PeekByte(Buffer,1) = 80) And (PeekByte(Buffer,2) = 78) Then
      ImageOk = ImageInfo_ReadPNG(ImageFile, ImageFileSize)      
   EndIf
 
   ;Check BMP
   If (ImageOk = False) And (PeekByte(Buffer,0) = 66) And (PeekByte(Buffer,1) = 77) Then
      ImageOk = ImageInfo_ReadBMP(ImageFile, ImageFileSize)            
   EndIf

   ;Check DDS
   If (ImageOk = False) And (PeekByte(Buffer,0) = 68) And (PeekByte(Buffer,1) = 68) And (PeekByte(Buffer,2) = 83)  And (PeekByte(Buffer,3) = 32) Then
      ImageOk = ImageInfo_ReadDDS(ImageFile, ImageFileSize)            
   EndIf
   
   ;Check TGA
   If ImageOk = False Then ImageOk = ImageInfo_ReadTGA(ImageFile, ImageFileSize)
           
   ;Check JPEG
   If ImageOk = False Then ImageOk = ImageInfo_ReadJPG(Buffer, ImageFile, ImageFileSize)
      

   CloseFile(ImageFile)
   FreeBank(Buffer)
   
   Return ImageOk
End Function

;Internal functions

Function ImageInfo_ReadBMP(ImageFile, ImageFileSize)
   If ImageFileSize<29 Return
   
   ImageInfo_Type = imgtype_BMP
   
   SeekFile(ImageFile, 18)
   ImageInfo_Width = ReadShort(ImageFile)
   
   SeekFile(ImageFile, 22)
   ImageInfo_Height = ReadShort(ImageFile)

   SeekFile(ImageFile, 28)
   ImageInfo_Depth = ReadByte(ImageFile)
   
   Return True
End Function

Function ImageInfo_ReadDDS(ImageFile, ImageFileSize)
   If ImageFileSize<129 Return
   
   ImageInfo_Type = imgtype_DDS
   
   SeekFile(ImageFile, 12)
   ImageInfo_Height = ReadInt(ImageFile)

   ;SeekFile(ImageFile, 16)
   ImageInfo_Width = ReadInt(ImageFile)

   ReadInt(ImageFile)   ;20 Pitch

   ;SeekFile(ImageFile, 24)
   ImageInfo_Depth = ReadInt(ImageFile)
   
   Return True
End Function

Function ImageInfo_ReadPNG(ImageFile, ImageFileSize)
   If ImageFileSize<25 Return
   
   Local b
   Local c   
   
   ImageInfo_Type = imgtype_PNG
   SeekFile(ImageFile, 24) 

   b = ReadByte(ImageFile)
   c = ReadByte(ImageFile)

   ;Color depth
   Select c
      Case 0
         ImageInfo_Depth = b; greyscale
      Case 2
         ImageInfo_Depth = b * 3; RGB
      Case 3
         ImageInfo_Depth = 8; Palette based
      Case 4
         ImageInfo_Depth = b * 2; greyscale with alpha
      Case 6
         ImageInfo_Depth = b * 4; RGB with alpha
      Default
         ImageInfo_Type = imgtype_Unknown
   End Select
   
   If ImageInfo_Type = imgtype_PNG Then
      seeked = SeekFile(ImageFile, 16)      
      ImageInfo_Width = Swap32(ReadInt(ImageFile))
      ImageInfo_Height = Swap32(ReadInt(ImageFile))            
      Return True
   EndIf   
End Function

Function ImageInfo_ReadJPG(Buffer, ImageFile, ImageFileSize)
   Local i
   Local Pos = 0
   Local BType
   
   ;find beginning of JPEG stream
   IsError = True
   While Pos<=ImageFileSize-4
      SeekFile(ImageFile, Pos)
      For i=0 To 3: PokeByte Buffer, i, ReadByte(ImageFile): Next
      If (PeekByte(Buffer,0) = $FF) And (PeekByte(Buffer,1) = $D8) And (PeekByte(Buffer,2) = $FF) And (PeekByte(Buffer,3) = $E0) Then
         IsError = False
         Exit
      EndIf   
      Pos = Pos + 1
   Wend
   If IsError Return
   Pos = FilePos(ImageFile) + Swap16(ReadShort(ImageFile))

   ;loop through Each marker Until we find the C0 marker (Or C1 Or C2) which
   ;has the image information
   IsError = True
   SeekFile(ImageFile, Pos)
   While Not Eof(ImageFile)
      If ReadByte(ImageFile) = $FF
         BType = ReadByte(ImageFile)
         Pos = FilePos(ImageFile) + Swap16(ReadShort(ImageFile))

         ; if the type is from SOF0 to SOF3
         If (BType >= $C0) And (BType <= $C3)
            i = ReadByte(ImageFile)
            ImageInfo_Height = Swap16(ReadShort(ImageFile))
            ImageInfo_Width = Swap16(ReadShort(ImageFile))
            ImageInfo_Depth = ReadByte(ImageFile) * 8
            ImageInfo_Type = imgtype_JPEG
             IsError = False
            Exit
         EndIf
         
         ; Goto next marker
         SeekFile(ImageFile, Pos)
      EndIf      
   Wend
      
   Return 1-IsError
End Function

Function ImageInfo_ReadTGA(ImageFile, ImageFileSize)
   If ImageFileSize<24+12 Return

   SeekFile(ImageFile, 0)
   If ReadByte(ImageFile)=0 And ReadByte(ImageFile)=0 And ReadByte(ImageFile)=2
      ImageInfo_Type = imgtype_TGA
   Else
      Return
   EndIf
   
   SeekFile(ImageFile, 12)
   ImageInfo_Width = ReadShort(ImageFile)
   ImageInfo_Height = ReadShort(ImageFile)
   ImageInfo_Depth = ReadShort(ImageFile)
   
   Return True   
End Function

Function Swap16%(Value%)
   Local b1 = Value And 255
   Local b2 = (Value Shr 8) And 255
   Return b1 Shl 8 Or b2
End Function

Function Swap32%(Value%) 
   Local b1 = Value And 255;
   Local b2 = (Value Shr 8) And 255;
   Local b3 = (Value Shr 16) And 255;
   Local b4 = (Value Shr 24) And 255;

   b1 = b1 Shl 24
   b2 = b2 Shl 16
   b3 = b3 Shl 8

   Return b1 Or b2 Or b3 Or b4

BladeRunner

Moderator

BeitragSa, März 14, 2009 14:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Tja, dann vermute ich simplerweise dass der Autor den Wert für den Fall speicherte dass er noch gebraucht würde, es dazu aber nie kam.
Nicht jeder Code ist perfekt. Eigentlich sind das die wenigsten.
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
 

hamztata

BeitragSa, März 14, 2009 14:39
Antworten mit Zitat
Benutzer-Profile anzeigen
mal ne andere frage


Code: [AUSKLAPPEN]
Function Swap32%(Value%) 
   Local b1 = Value And 255;
   Local b2 = (Value Shr 8) And 255;
   Local b3 = (Value Shr 16) And 255;
   Local b4 = (Value Shr 24) And 255;

   b1 = b1 Shl 24
   b2 = b2 Shl 16
   b3 = b3 Shl 8

   Return b1 Or b2 Or b3 Or b4
End Function


wobei Value = 131072 ist, hauts irgendwie nicht hin, müßte 512 rauskommen.
oder es wird hier irgendwie falsch ausgelesen...

Code: [AUSKLAPPEN]
Function ImageInfo_ReadPNG(ImageFile, ImageFileSize)
   If ImageFileSize<25 Return
   
   Local b
   Local c   
   
   ImageInfo_Type = imgtype_PNG
   SeekFile(ImageFile, 24) 

   b = ReadByte(ImageFile)
   c = ReadByte(ImageFile)

   ;Color depth
   Select c
      Case 0
         ImageInfo_Depth = b; greyscale
      Case 2
         ImageInfo_Depth = b * 3; RGB
      Case 3
         ImageInfo_Depth = 8; Palette based
      Case 4
         ImageInfo_Depth = b * 2; greyscale with alpha
      Case 6
         ImageInfo_Depth = b * 4; RGB with alpha
      Default
         ImageInfo_Type = imgtype_Unknown
   End Select
   
   If ImageInfo_Type = imgtype_PNG Then
      seeked = SeekFile(ImageFile, 16)      
      ImageInfo_Width = Swap32(ReadInt(ImageFile))
      ImageInfo_Height = Swap32(ReadInt(ImageFile))            
      Return True
   EndIf   
End Function

BladeRunner

Moderator

BeitragSa, März 14, 2009 14:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hast Du überprüft ob value $00 02 00 00 ist, oder vermutest Du das nur?

Die Funktion swap32 als solches funktioniert korrekt.
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
 

hamztata

BeitragSa, März 14, 2009 14:51
Antworten mit Zitat
Benutzer-Profile anzeigen
value zeigt bei mir, wenn ichs mir anzeigen lasse 131072 an?!?

also ReadInt(ImageFile) ist 131072....

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, März 14, 2009 14:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Du weisst aber schon, dass ''deine'' Funktion Swap32%(Value%) lediglich die Bytes innerhalb eines Integers vertauscht, und der Wert von 131072dec auch gleich 00020000hex ist. Und wenn du genau hinsehen würdest, dass da auch deine 512dec drine ist. Nämlich hast du ''deine'' Funktion einfach mal einmal zu oft ausgeführt. Wenn man Fremdcode übernimmt, sollte man damit nicht einfach Sachen einsetzen, wenn man nichtmal den Sinn dazu verstanden hat. Die Funktion ist kein Allgemeinrezept zum auslesen von Bytes aus Dateien, sondern so wie ich auch in vorherigen tagen beschrieben, zwei grundlegend unterschiedliche Speicherarten gibt. Die eine wie ein PC arbeitet und einmal wie ein Mac arbeitet. Der Grund für das ''vertauschen'' der Bytes beim PC ist nämlich der, dass so der Rechner schneller mit den Zahlen rechnen kann --> Optimierung. Beim Mac dagegen haben sie sich entweder was anderes ausgedacht, oder belassen es einfach aus Bequemlichkeit für die Programmierer so wie es ist. Aus diesem Grund gibt es nun unterschiedliche Dateiformate, da sie überall grundsätzlich ihr jeweiligen Standard einhalten müssen. Egal ob Mac oder PC.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

hamztata

BeitragSa, März 14, 2009 15:10
Antworten mit Zitat
Benutzer-Profile anzeigen
ähm es ist fremdcode, aber den hab ich so gelassen wie er ist, und nirgends eingesetzt.
und ich geb zu, ich sehs grad nicht, wo es einmal zu oft ausgeführt wird.

kannst du mir sagen wie ich zu den 512 komme.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, März 14, 2009 15:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn ein Byte 256 verschiedene Zustände hat (also Werte von 0 bis 255), und mit dem Hexcode $FF als maximum bezeichnet werden kann, dann geht es bei +1 zusätzlich mit dem nächsten Byte weiter. Das sähe dann so aus $0100 = 256 dezimal. Das doppelte wäre dann $0200 was 512 dezimal bedeuten würde. Demnach verursacht Swap immer das vertauschen der Bytes innerhalb eines Integers. Es ist somit entweder einmal zu oft, oder garnicht ausgeführt worden. Wenn es nicht ausgeführt wurde, dann einmal durchjagen, und die Werte müssten stimmen. Wenn bereits einmal oder mehrmals ausgeführt wurde, dann auf eine einzige Ausführung einstellen. Das hiesse in etwa Wert = Swap(Wert).
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

hamztata

BeitragSa, März 14, 2009 15:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Es ist somit entweder einmal zu oft, oder garnicht ausgeführt worden. Wenn es nicht ausgeführt wurde, dann einmal durchjagen, und die Werte müssten stimmen. Wenn bereits einmal oder mehrmals ausgeführt wurde, dann auf eine einzige Ausführung einstellen. Das hiesse in etwa Wert = Swap(Wert).


sorry, dass ich mich so doof anstelle.
aber ich mach zum ersten mal was mit irgendwelchen byteverschiebungen.
ich seh da bisher nur teilweise durch.

wie meinst du das oben?
wo soll es einmal zu oft, oder zuwenig ausgeführt worden sein.

swap wird doch nur zweimal an dieser stelle benutzt um höhe und breite herauszubekommen.
ich mein, wenn man auch anders auf die 512 kommen würde, wärs auch toll.
jedenfalls verstehe ich das nicht ganz.
kannste jetzt mit mir schimpfen, ich krieg das grad nicht in meinen kopf rein

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, März 14, 2009 16:16
Antworten mit Zitat
Benutzer-Profile anzeigen
In der Zahl 131072 ist bereits anders ausgelesen schon die 512 enthalten. Denn:
Code: [AUSKLAPPEN]
00 02 00 00 hex = 131072 dec
AA BB CC DD (also 'AA' ist eim Byte, 'BB' ist ein Byte etc...)

das ganze dann 'umdrehen' zu

DD CC BB AA (das macht Swap3D für dich)
00 00 02 00 hex = 512 dec


Die Zahl 131072 beinhaltet bereits diesen Wert. Und wenn du 131072 erhalten hast (so wie du oben beschrieben hast), dann mußt du diesen Wert noch mit Swap32() umwandeln. Das sähe dann so aus: Depth = Swap32( Wert ).

Wenn du nur die Dimensionen von Bildern wissen willst (also ImageWidth und ImageHeight), dann schaue dir mal mein Eintrag im Codearchiv an. Dieser funktioniert und ist von Prinzip einfacher aufgebaut. https://www.blitzforum.de/foru...hp?t=30177
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

hamztata

BeitragSa, März 14, 2009 16:30
Antworten mit Zitat
Benutzer-Profile anzeigen
ImageInfo_Width = Swap32(ReadInt(ImageFile))

das machts ja in meinem code, kommt aber 0 raus, ich schau mir mal deinen code an.

das ist alles?
um höhe und breite rauszubekommen?
meine fresse, das ist doch viel einfacher
Code: [AUSKLAPPEN]
         Case ".png"
            IFile=ReadFile(FImage)
            SeekFile IFile,16
            IFileX=(ReadByte(IFile)*$1000000)+(ReadByte(IFile)*$10000)+(ReadByte(IFile)*$100)+(ReadByte(IFile)*$1)
            IFileY=(ReadByte(IFile)*$1000000)+(ReadByte(IFile)*$10000)+(ReadByte(IFile)*$100)+(ReadByte(IFile)*$1)
            CloseFile IFile
            ICheck=1



funktioniert super.
brauch nur noch .dds dort liegts height:12 width:16 depth:24
aber das krieg ich allein hin, ist übrigends da ReadInt

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, März 14, 2009 16:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Es wäre für uns alle einfacher gewesen, wenn wir gleich zu beginn gewusst hätten worauf du genau hinaus willst. Ich bin die ganze Zeit davon ausgegangen, du willst die Depth herausfinden, was in meinen Augen die Farbtiefe eines Bildes bedeutet. Außerdem hatte ich dir den Link bereits gestern oder so schon gegeben. Keine Ahnung warum das einfach ignoriert wird.

Noch nebenbei: Wie du an meinem Code erkennen kannst, lese ich die Bytes einzelnd ein und ''tausche'' sie also direkt um. Denn die 4 Bytes hätte man auch per ReadInt auf einmal einlesen können und dann durch so eine Funktion wie Swap32 nachträglich umsetzen können. Das Ergebnis ist das selbe.

Im übrigen ist es nicht immer so einfach, siehe dazu mal JPG an. Das war schon ein kleiner Krampf, da viele Dokumentationen im Internet falsch sind und nur voneinander abkupfern. Von daher habe ich nahezu alle Formate mir selbst über einem Hexeditor raus gesucht.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

hamztata

BeitragSa, März 14, 2009 20:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Aber echt toll dein code.
Aber ich kämpfe auch grad mit jpg, weil ich deinen code übersetze in eine andere sprache.
Filesize geht noch, aber höhe und breite liest es noch nicht richtig aus....aber ich krieg das noch hin.

Dachte dass jedes format an bestimmter stelle diese werte hat.
Aber ich wussel mich da schon durch, dank dir.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group