Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#10

AW: Surface Stream

  Alt 29. Dez 2013, 18:33
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

Geändert von EWeiss (29. Dez 2013 um 19:20 Uhr)
  Mit Zitat antworten Zitat