BGR- statt RGB-Ausgabe bei Verwendung von TLazIntfImage

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
br_klaus
Beiträge: 244
Registriert: Do 21. Jan 2010, 22:33
OS, Lazarus, FPC: Windows Vista (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: z.z. Brasilien, sonst 82335 Berg-Leoni (südlich von München)

BGR- statt RGB-Ausgabe bei Verwendung von TLazIntfImage

Beitrag von br_klaus »

Hallo, kann es sein, daß da in Lazarus ein kleiner Bug ist?
Wenn ich die Pixel in der TLazIntfImage färbe (mittels GetDataLineStart() ),
dann bekomme ich immer die umgekehrte Reihenfolge der Farbwerte.
Ich muß erst die Reihenfolge umkehren, dann erhalte ich den gewünschten Farbton.
Änderung der Eigenschaft ByteOrder in der RawImage bringt da keine Änderung.

Oder gibt es da noch eine Eigenschaft, die man dazu aktivieren muß?
 
Herzlichen Dank!
P. Nikolaus
 
 
Hier mein kleines Programm dazu (Image1 ist fast so groß wie die Form selber):

Code: Alles auswählen

unit Unit3;
{$mode objfpc}{$H+}
interface
uses
  Classes, LResources, Forms, Controls, Graphics,   ExtCtrls,  LCLIntf, IntfGraphics, GraphType;
type
  TForm3 = class(TForm)
    Image1: TImage;
    procedure FormChangeBounds(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  end;
 
var Form3: TForm3;  intf: TLazIntfImage;
 
implementation
 
function UmkehrFarbe(col:TColor):TColor; // RGB --> BGR
  begin result:= col and $FF00 + col shr 16 + (col and $ff) shl 16; end;
 
procedure FarbRect(r:TRect; col:TColor);    // färbt das Rechteck mit col
    var i,j:integer; c:TColor;
  begin
    with intf,r do
    begin c:=UmkehrFarbe(col);
          for j:=top to bottom-1 do for i:=left to right-1 do
                PColor(GetDataLineStart(j)+3*i)^:= c;
    end;
  end;
 
procedure TForm3.FormChangeBounds(Sender: TObject);
  var raw:TRawImageDescription;
      col:TColor;   r:TRect;  w,h:integer;
begin
   intf:=TlazIntfImage.create(0,0);
  with image1 do begin w:=width; h:=height;  r:= Bounds(0,0,w,h); end;
 
    raw.Init_BPP24_B8G8R8_BIO_TTB(w,h);   // 24 bpp
//    with raw do
//       ByteOrder:= TrawImageByteOrder(1-byte(ByteOrder)); // ändert nichts!
 
    intf.DataDescription:=raw;
 
    col:=clblue;
         FarbRect(r, col);          // benutzt UmkehrFarbe(col) !
         Farbrect(Rect(10,10,100,100), clskyblue);
    image1.Picture.Bitmap.LoadFromIntfImage(intf);
  intf.Free;
end;
 
procedure TForm3.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if key = 27 then halt;  // Escape-Taste
end;
 
initialization
  {$I unit3.lrs}
end.


Und die Projekt-Datei:

Code: Alles auswählen

program project3;
 
{$mode objfpc}{$H+}
 
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms, Unit3, LResources
  { you can add units after this };
 
{$IFDEF WINDOWS}{$R project3.rc}{$ENDIF}
 
begin
  {$I project3.lrs}
  Application.Initialize;
  Application.CreateForm(TForm3, Form3);
  Application.Run;
end.

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: BGR- statt RGB-Ausgabe bei Verwendung von TLazIntfImage

Beitrag von Scotty »

Ich habe gestern auch lange beim Festlegen der Palette eines ColorDialogs probiert. aColor:='RRGGBB' funktioniert nicht, HexStr(aColor,6); geht aber.

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: BGR- statt RGB-Ausgabe bei Verwendung von TLazIntfImage

Beitrag von Bora4d »

Das ist kein BUG, es ist normal weil Windows seine Bitmaps in BGR-Format hat. Wegen performance haben die LCL-Jungs so gelassen glaube ich. Unter Delphi ist es auch so. Wenn TlazIntfImage-Bits gezeichnet werden soll dann wird das entweder mit BitBlt, SetDIBBits, StretchDIBits oder ähnliche Windows-Funktionen gemacht und die erwarten nunmal BGR-Order.
Mit deiner "function UmkehrFarbe(col:TColor):TColor;"-Funktion machst du unnötiges und verschwendest damit Rechenzeit.

br_klaus
Beiträge: 244
Registriert: Do 21. Jan 2010, 22:33
OS, Lazarus, FPC: Windows Vista (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: z.z. Brasilien, sonst 82335 Berg-Leoni (südlich von München)

Re: BGR- statt RGB-Ausgabe bei Verwendung von TLazIntfImage

Beitrag von br_klaus »

@Bora4d:

Herzlichen Dank für deine Antwort. Könntest du mir noch sagen, wie ich das im konkreten Fall mit diesen Prozeduren machen kann?

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Re: BGR- statt RGB-Ausgabe bei Verwendung von TLazIntfImage

Beitrag von theo »

br_klaus hat geschrieben:@Bora4d:

Herzlichen Dank für deine Antwort. Könntest du mir noch sagen, wie ich das im konkreten Fall mit diesen Prozeduren machen kann?


Mal ne andere Frage: Warum benutzt du nicht einfach Canvas.FillRect, statt dieser komplizierten Geschichte?

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: BGR- statt RGB-Ausgabe bei Verwendung von TLazIntfImage

Beitrag von Bora4d »

br_klaus hat geschrieben:@Bora4d:

Herzlichen Dank für deine Antwort. Könntest du mir noch sagen, wie ich das im konkreten Fall mit diesen Prozeduren machen kann?


Entschuldige ich hab's übersehen. Ich dachte du benutzt UmkehrFarbe-Funktion in der Schleife. Du hast es schon richtig gemacht. Vergiß meinen letzten Satz.

Antworten