![]() |
Surface Stream
Ich möchte mein Surface (nein nicht das man kaufen kann) also das von DirectX in einen Stream(TStream) kopieren.
Ich finde nur Möglichkeiten unter SlimDX Zitat:
Was fehlt mir da .. :oops: SDK SlimDX
Code:
namespace SlimDX { // Summary: // A DataRectangle provides supporting information for a SlimDX.DataStream whose // data is organized within two dimensions (a rectangle). public class DataRectangle { // Summary: // Initializes a new instance of the SlimDX.DataRectangle class. // // Parameters: // pitch: // The row pitch, in bytes. // // data: // The data. public DataRectangle(int pitch, DataStream data); // Summary: // Gets the SlimDX.DataStream containing the actual data bytes. public DataStream Data { get; } // // Summary: // Gets or sets the number of bytes of data between two consecutive (1D) rows // of data. public int Pitch { get; set; } } }
Code:
// Summary:
// Reads a sequence of bytes from the current stream and advances the position // within the stream by the number of bytes read. // // Parameters: // buffer: // An array of values to be read from the stream. // // offset: // The zero-based byte offset in buffer at which to begin storing the data read // from the current stream. // // count: // The maximum number of bytes to be read from the current stream. // // Returns: // The number of bytes read from the stream. // // Exceptions: // System.NotSupportedException: // This stream does not support reading. // // System.ArgumentNullException: // buffer is a null reference. // // System.ArgumentOutOfRangeException: // offset or count is negative. // // System.ArgumentException: // The sum of offset and count is greater than the buffer length. public override int Read(byte[] buffer, int offset, int count); gruss |
AW: Surface Stream
Hab das Surface jetzt erst mal temporär in ein Bitmap gespeichert.
Das wird auf die Platte geschaufelt so alle 250 MS wenn ich aber die Farben ermittle sind es immer die falschen ;)
Delphi-Quellcode:
sorry hab da mit TMemoryStream noch nichts am hut gehabt.
function TCapX.GetColor(gs: TMemoryStream; List: TStrings): TColor;
var bu : Array[0..3] of byte; i: Integer; pos: Integer; begin i := 0; r := 0; g := 0; b := 0; for pos := 0 to List.Count - 1 do begin gs.Position := strToInt(List.Strings[pos]); //gs.Seek(gs.Position, 4); gs.Read(bu, 0); r := r + bu[2]; g := g + bu[1]; b := b + bu[0]; inc(I); end; Result := RGB2TColor(r div i , g div i , b div i); end; Wollte die Funktion eigentlich so auslegen was aber mit Listen nicht funktioniert.
Delphi-Quellcode:
for Pos in List
gruss |
AW: Surface Stream
Was ist das denn?
Delphi-Quellcode:
gs.Read(bu, 0);
1. sollte man
Delphi-Quellcode:
statt Read verwenden und 2. muss das zweite Argument die Anzahl der zu lesenden Bytes enthalten (also sizeof(bu)).
Readbuffer
|
AW: Surface Stream
Zitat:
ReadBuffer liest genau so viel, wie man angibt und bei weniger, gibt es eine Exception. |
AW: Surface Stream
hmm Danke nur was ist jetzt richtig ;)
gruss |
AW: Surface Stream
Sorry Change denke hab ne Lösung gefunden.
gruss |
AW: Surface Stream
Was richtig ist ... das was man benötigt wird.
Wenn du Result selber auswerten willst, dann Read und wenn du einfach blind davon ausgehst, daß es geht und du nir im Fehlerfall eine automatische "Fehlerbehandlung" haben möchtest, dann ReadBuffer. Keine Ahnung, was bei dem originalen Read der zweite Parameter ist (vermutlich der Anfang im ZielArray), aber im Delphi ist es die Länge, was im Original ganz bestimmt der 3. Parameter war. Wegen dem Bitmap auf D:\ - Was ist, wenn es kein D: gibt, dieses nicht beschreibbar ist oder die Schreibrechte fehlen? - Tipp: TPath.GetTempPath oder TPath.GetTempFileName aus IOUtils |
AW: Surface Stream
Danke ;)
ich vermisse die Funktion DirectX GraphicsStream man mag es nicht glauben scheint aber unter Delphi nicht zu existieren. Zitat:
Zitat:
Delphi-Quellcode:
Aber alle meine Farben sind falsch.
gs.ReadBuffer(bu, sizeof(bu));
Aber die gibt es wieder nicht. Dann wäre auch das schreiben auf die Platte hinfällig gewesen.
Delphi-Quellcode:
Jetzt kann ich beides nicht verwenden
gs: GraphicsStream; // <<< Direct3D9?? nix
gs.Read(bu, 0, sizeof(bu)); DirectX > GraphicsStream (DataStream in SlimDX) gruss |
AW: Surface Stream
Sind nur die Farben falsch? Also eigentlich schon das richtige Bild? Dann hat dein Surface vermutlich nicht das Format ABGR wie es für die GDI üblich ist. Gängig wäre noch ARGB, da würde einfach B und R tauschen genügen. Da DX aber ja eine ganze Fülle an Farbformaten unterstützt, kommt es darauf an, wie du dein Surface angelegt hast.
|
AW: Surface Stream
Zitat:
Das Problem ist die Farben zu ermitteln. TFileStream und TMemoryStream stellen nur zwei Parameter zur Verfügung.
Delphi-Quellcode:
Ich benötige aber 3 zum lesen
function Read(var Buffer; Count: Longint): Longint; virtual; abstract;
property Position: Int64 read GetPosition write SetPosition;
Code:
Der DataStream kann nur unter .NET SlimDX benutzt werden.
int DataStream::Read( array<Byte>^ buffer, int offset, int count )
{ return ReadRange<Byte>( buffer, offset, count ); } generic<typename T> where T : value class int DataStream::ReadRange( array<T>^ buffer, int offset, int count ) { if( !m_CanRead ) throw gcnew NotSupportedException(); Utilities::CheckArrayBounds( buffer, offset, count ); //Truncate the count to the end of the stream Int64 elementSize = static_cast<Int64>( sizeof(T) ); size_t actualCount = min( static_cast<size_t>((Length - m_Position) / elementSize), static_cast<size_t>( count ) ); pin_ptr<T> pinnedBuffer = &buffer[offset]; memcpy( pinnedBuffer, m_Buffer + m_Position, static_cast<size_t>( actualCount * elementSize ) ); m_Position += actualCount * elementSize; return static_cast<int>( actualCount ); } Int64 DataStream::Position::get() { return m_Position; } void DataStream::Position::set( System::Int64 value ) { Seek( value, System::IO::SeekOrigin::Begin ); } GraphicsStream gibt es unter Delphi nicht auch dieser hat 3 Parameter. Deshalb habe ich auch mit Seek versucht auf die richtige Position zu kommen aber ohne ansprechendes Ergebnis. Zitat:
Wird hier der Stream von hinten gelesen? Eine andere Variante mit "pos in posin"
Delphi-Quellcode:
Macht aber keinen unterschied..
function TCapX.GetColor(gs: TFileStream; List: TStrings): COLORREF;
var bu : Array[0..3] of byte; i, n: Integer; pos: Integer; posin: Array of Integer; begin i := 0; r := 0; g := 0; b := 0; SetLength(posin, List.Count); for n := 0 to List.Count - 1 do posin[n] := StrToInt(List.Strings[n]); for pos in posin do begin gs.Position := pos; //StrToInt(List.Strings[pos]); gs.Read(bu, sizeof(bu)); r := r + bu[2]; g := g + bu[1]; b := b + bu[0]; inc(I); end; Result := ColorARGB(255, RGB(r div i , g div i , b div i)); FillChar(posin, SizeOf(posin), 0); end; Ich glaube langsam das die Streams hier das Problem verursachen. Normalerweise müsste das letzte Byte bu[3] immer 255 sein da es den AlphaChannel repräsentiert. Ist es aber nicht. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:25 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