Seekfile->warum offset angabe?
Übersicht

hamztataBetreff: Seekfile->warum offset angabe? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
value zeigt bei mir, wenn ichs mir anzeigen lasse 131072 an?!?
also ReadInt(ImageFile) ist 131072.... |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ä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. |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group