![]() |
Teil-Records aus Stream lesen
Hi,
Also sagen wir ich hätte sowas:
Delphi-Quellcode:
Wenn ich jetzt das Record aus nem Stream lesen will dann mach ich das ja so:
TTest = packed record
nein: Byte; ja: Word; end;
Delphi-Quellcode:
Wie mach ich das aber wenn ich ab dem zweiten Byte lesen will? Also wenn ich das erste Byte des Records nicht einlesen will... also theoretisch sowas:
Stream.Read(ATest,SizeOf(TTest));
Delphi-Quellcode:
So das in dem Beispiel die Variable "nein" nicht eingelesen wird... ?
Stream.Read(ATest+1,SizeOf(TTest)-1);
Ich hab da schon irgendwas versucht mit Pointern und hin und her aber das war Rumprobiererei und wurde auch nichtmal compiliert.. Gruß Neutral General |
Re: Teil-Records aus Stream lesen
Hi,
das müsste doch so gehen
Delphi-Quellcode:
stream.Position:= stream.Position+ 1;
|
Re: Teil-Records aus Stream lesen
Hi,
nein so mein ich das nicht.. Im Stream steht das erste Byte nicht drin. Mein Record: ________ 1 | 2 | 3 | Das erste (rote) Byte will ich nicht auslesen. Sondern erst das zweite und dritte. Nur ich darf halt nicht die Speicherstelle des Records angeben sondern die Speicherstelle eins weiter. Also hinter der Variable "ja".. so das in diesem Beispiel nur "nein" geladen wird. Ich hoffe das war jetzt verständlich Gruß Neutral General |
Re: Teil-Records aus Stream lesen
Hmm, da würde ich, sofern es nur ein kleiner Teil ist (hier nur das Word), dieses per Hand auslesen.
Wenn es ein größerer Record ist, würde ich alles Auslesen und danach die unerwünschten Bestandteile resette. mfG Markus Ähem Halt, ich raff gerade deine Grafik ... da hilft wohl nur die "Zu-Fuß-Variante", oder du nimmst einen zweiten Teil-Record, welchen du einliest und dann rüberschiebst in den richtigen. |
Re: Teil-Records aus Stream lesen
Nein das muss anders gehn.. Da könnt ich wetten.
|
Re: Teil-Records aus Stream lesen
Hallo,
hier ist ein eher defensiver Ansatz, der zunächst den Offset des ersten zu lesenden Recordelements berechnet. Aus diesem Wert und der Recordgröße ergibt sich die Anzahl der zu lesenden Bytes:
Delphi-Quellcode:
Gruß Hawkeye
var
Test : TTest; FieldOffset : Integer; ReadSize : Integer; begin FieldOffset := Cardinal(@Test.ja) - Cardinal(@Test); ReadSize := SizeOf(TTest) - FieldOffset; Stream.Read(Test.ja, ReadSize); end; |
Re: Teil-Records aus Stream lesen
Hi,
Also in Wirklichkeit hab ich sowas:
Delphi-Quellcode:
Ich hab jetzt mal sowas probiert...
TGIFHeader = packed record
Version: String[6]; Width: Word; Height: Word; //.. end; PGIFHeader = ^TGIFHeader
Delphi-Quellcode:
Das wäre meine Logik aber da bekomm ich bei FHeader := ... haue^^
var P: Pointer;
begin P := @FHeader; P := PPointer(Cardinal(P) + 1)^; // Da müsste ich doch beim ersten Zeichen von Version landen oder? SetLength(FHeader.Version,6); // Weil das allererste Byte ist ja das Byte wo die Länge drinsteht vom String AStream.Read(P,10); // Und das darf nicht überschrieben werden. FHeader := PGIFHeader(PPointer(Cardinal(P) - 1)^)^; ShowMessage(FHeader.Version); end; Gruß Neutral General |
Re: Teil-Records aus Stream lesen
Hallo,
was du laut Format-Spezifikation brauchst sieht eher so aus:
Delphi-Quellcode:
String[6] ist also auf jeden Fall falsch. Wenn du jeden GIF Block-Typ einzeln gemäß Spezifikation definierst, dann fällt dein Problem einfach weg, aber grundsätzlich funktioniert die von Hawkeye vorgestellte Methode.
type
TGIF_HEader = packed record Signature: array [0..2] of Char; Version: array [0..2] of Char; end; TGIF_LogicalScreenDescriptor = packed record LogicalScreenWidth: Word; LogicalScreenHeight: Word; Options: Byte; BackgroundColorIndex: Byte; PixelAspectRatio: Byte; end; // ... Grüße vom marabu |
Re: Teil-Records aus Stream lesen
Hi,
Ja ok danke.. Naja das Problem ist: Zitat:
|
Re: Teil-Records aus Stream lesen
Hallo Michael,
ich hatte dir unterstellt, dass du den feinen Unterschied zwischen String[6] und array [0..5] of Char nicht kennst - entschuldige. Dein Problem kannst du viel einfacher lösen:
Delphi-Quellcode:
Du brauchst kein getürktes Längenbyte.
type
TGIF_Header = packed record Signature: array [0..2] of Char; Version: array [0..2] of Char; end; procedure TDemoForm.ButtonClick(Sender: TObject); var gh: TGIF_Header; begin gh.Signature := 'GIF'; gh.Version := '89a'; ShowMessage(Format('<%s> <%s>', [String(gh.Signature), String(gh.Version)])); end; Freundliche Grüße |
Re: Teil-Records aus Stream lesen
Ok ja hab jetzt Char Arrays benutzt aber ich hätte da noch eine kleine Frage am Rande:
Zitat:
1 000 0 100 1: Globale Farbtabelle = true 000: 255 Bit/Pixel ? :gruebel: 0 : Farbtabelle nicht sortiert 100: 96 Byte große Tabelle Das müsste dieses Byte nach meiner Dateispezifikation aussagen. Aber 0 bzw 255 Bits/Pixel.. Wie soll ich das verstehn? Also 8 Bit/Pixel versteh ich ja noch.. da wird in je einem Byte der Index der Farbe aus der Farbtabelle stehn. aber was ist das? Gruß Neutral General |
Re: Teil-Records aus Stream lesen
Wenn ich in die Original-Spezifikation von CompuServe schaue, dann möchte ich die Flags anders interpretieren:
Code:
1 000 0 100
--- 32 entries in GCT - ignore (GIF 87a) --- one bit per color in original palette - next block is GCT |
Re: Teil-Records aus Stream lesen
Zitat:
Was ich aber trotzdem nicht verstehe ist Zitat:
Gruß Neutral General |
Re: Teil-Records aus Stream lesen
Vielleicht bedeutet es: Mit einem Bit pro Basisfarbe (R,G,B) wird ein Farbraum mit 8 Farben (dual: 000 ... 111) festgelegt.
Du musst aber diesen Wert nirgends verwenden, soweit ich sehen kann. |
Re: Teil-Records aus Stream lesen
mhhh... k also das heißt ich hab im eigentlichen Bild so oder so immer nur ein Byte pro Farbe das auf eine Farbe in der Tabelle verweißt? Egal was da jetzt für Werte bei raus kommen bei diesem Bit/Pixel ?
|
Re: Teil-Records aus Stream lesen
Zitat:
|
Re: Teil-Records aus Stream lesen
:idea: :)
ahhh :) das klingt logisch... Danke |
Re: Teil-Records aus Stream lesen
Guten Morgen,
ich bleibe vorerst bei meiner Interpretation. Der Wert 7 (dual 111) für die color resolution ist nach meiner Auffassung die Anzahl Bits pro Farbkanal im von GIF verwendeten RGB-Farbraum. Die größtmögliche Farbtiefe entspricht dann 24-bit Farben (TrueColor), die kleinstmögliche Farbtiefe ergibt sich zwangsläufig. Die Bezeichnung bit/pixel ist irreführend. Compuserve schreibt in der GIF89a Specification iv) Color Resolution - Number of bits per primary color available to the original image, minus 1. This value represents the size of the entire palette from which the colors in the graphic were selected, not the number of colors actually used in the graphic. For example, if the value in this field is 3, then the palette of the original image had 4 bits per primary color available to create the image. This value should be set to indicate the richness of the original palette, even if not every color from the whole palette is available on the source machine. Die Hervorhebungen stammen von mir und beziehen sich auf meine Interpretation. Zitat:
Freundliche Grüße |
Re: Teil-Records aus Stream lesen
Zitat:
Gruß Neutral General |
Re: Teil-Records aus Stream lesen
Du verschwendest deine Aufmerksamkeit an eine Information, deren Wert für dich zweifelhaft ist. Die Größe der ursprünglichen Palette (welche dem Generator des Bildes zur Verfügung stand) könnte sogar ein willkürlicher Wert sein. Ich denke du brauchst ihn nicht, aber ich kenne mich mit GIF (wie mit so vielem anderen) nicht aus und kann deshalb auch falsch liegen.
Die Farben in GCT und LCT sind laut Spezifikation RGB Byte-Tripel. Die GCT kannst du aber getrost vergessen, solange der Local Image Descriptor eine Local Color Table aufweist. Dort würde ich mal nachsehen. Vielleicht solltest du wirklich ein oder mehrere (kleine) Referenzbilder erzeugen, bereit stellen und die Format-Diskussion auf diesen aufbauen. Freundliche Grüße |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz