Bitmap.Canvas.Pixels[] geht nicht richtig.

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Mathias
Beiträge: 6918
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Bitmap.Canvas.Pixels[] geht nicht richtig.

Beitrag von Mathias »

Obwoh ich Pixel in der Picture verändert habe, zeichnet Canvas,Draw die Picture unverändert.
Als Beweis, das ich die Pixel verändert habe, zeichne ich das Bild nochmal Pixel für Pixel.
Das es den Alphaknal nicht mit zeichnet, die ist ein bekanntes Problem, aber um dies geht es hier nicht.
Siehe Anhang.

Wieso habe ich diesen komischen Effekt ?

Code: Alles auswählen

procedure TForm1.Button2Click(Sender: TObject);
var
  Bit: TPicture;
  x, y: integer;
begin
  Bit := TPicture.Create;
  Bit.LoadFromFile('project1.ico');
  for x := 1 to 30 do begin
    for y := 1 to 30 do begin
      Bit.Bitmap.Canvas.Pixels[x, y] := Random($FFFFFF);
    end;
  end;
  Canvas.Draw(0, 0, Bit.Bitmap); // Es wird unverändert gezeichnet. 
  for x := 0 to Bit.Width - 1 do begin
    for y := 0 to Bit.Height - 1 do begin
      Canvas.Pixels[x, y + Bit.Height] := Bit.Bitmap.Canvas.Pixels[x, y];
    end;
  end;
  Bit.Free;
end;
Dateianhänge
Zwischenablage-1.jpg
Zwischenablage-1.jpg (16.81 KiB) 781 mal betrachtet
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Bitmap.Canvas.Pixels[] geht nicht richtig.

Beitrag von Michl »

Teste mal, ob es so geht:

Code: Alles auswählen

...
  Bit.LoadFromFile('project1.ico');
  Bit.Bitmap.PixelFormat := pf24bit;
...

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Mathias
Beiträge: 6918
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Bitmap.Canvas.Pixels[] geht nicht richtig.

Beitrag von Mathias »

Bringt aber nicht viel, jetzt wird anstelle des Icons alles schwarz.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Bitmap.Canvas.Pixels[] geht nicht richtig.

Beitrag von Michl »

Habe es eben mal getestet. Unter Windows geht oben genannte Möglichkeit.

Wenn du ein mit einem Alphakanal bestücktes Bitmap ändern willst, musst du imho über LazIntfImage gehen (siehe z.B. http://wiki.freepascal.org/Developing_with_Graphics)

So was geht z.B. bei mir:

Code: Alles auswählen

uses ... FPimage, IntfGraphics;
...
procedure TForm1.Button1Click(Sender: TObject);
var
  Pict: TPicture;
  x, y: integer;
  col: TFPColor;
  IntfImg: TLazIntfImage;
begin
  Pict := TPicture.Create;
  Pict.LoadFromFile('project1.ico');
  IntfImg := Pict.Bitmap.CreateIntfImage;
 
  for x := 0 to Pict.Width - 1 do
    for y := 0 to Pict.Height - 1 do begin
      col := IntfImg.Colors[x, y];
      col.red   := $FF00 xor col.red;
      col.green := $FF00 xor col.green;
      col.blue  := $FF00 xor col.blue;
      IntfImg.Colors[x, y] := col;
    end;
 
  Pict.Bitmap.LoadFromIntfImage(IntfImg);
  Canvas.Draw(0, 0, Pict.Bitmap);
  IntfImg.Free;
  Pict.Free;
end;

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Mathias
Beiträge: 6918
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Bitmap.Canvas.Pixels[] geht nicht richtig.

Beitrag von Mathias »

Das man das Ganze über Umwege machen kann ist mir auch bekannt.

Mich interessiert es, wieso, das es dieses komische Verhalten gibt.
Man ändert Pixel, bei der Ausgabe sie man keine Änderung, aber trotzdem wurden sie geändert. :?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten