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.
Das Bild ist einwandfrei wenn ich es abspeichere
Das Problem ist die Farben zu ermitteln.
TFileStream und TMemoryStream stellen nur zwei Parameter zur Verfügung.
Delphi-Quellcode:
function Read(var Buffer; Count: Longint): Longint; virtual; abstract;
property Position: Int64 read GetPosition write SetPosition;
Ich benötige aber 3 zum lesen
Code:
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 );
}
Der DataStream kann nur unter .NET SlimDX benutzt werden.
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:
//Truncate the count to the end of the stream
Hmm Das macht mich etwas stutzig.
Wird hier der Stream von hinten gelesen?
Eine andere Variante mit "pos in posin"
Delphi-Quellcode:
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;
Macht aber keinen unterschied..
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