Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Pen.Color wird ignoriert (https://www.delphipraxis.net/216165-pen-color-wird-ignoriert.html)

palmakunkel 12. Nov 2024 14:00

Pen.Color wird ignoriert
 
Liebe Delphi-Gemeinde, ich brauche Hilfe:
bei folgendem Code wird die Pen.Color ignoriert. Es wird immer weiß gezeichnet, ganz gleich was ich setze. Wenn ich in Img direkt ein Bitmap lade klappt es.

type
TForm1 = class(TForm)
...
Img: TImage;
...

procedure ConvertToBMP(const FileName: string; var Img: TImage);
var PNG: TPNGObject;
ts: string;
begin
if UpperCase(TPath.GetExtension(FileName))='.PNG' then
begin
PNG := TPNGObject.Create;
try
PNG.LoadFromFile(FileName);
Img.Picture.Bitmap.Assign(PNG);
finally
PNG.Free;
end;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Img.Canvas.Brush.Color:=clWhite;
Img.Canvas.FloodFill(1,1,clBlack,fsSurface);

ConvertToBMP('Aloahe2.png', Img);

Img.Canvas.Pen.Color:=clBlack;
Img.Canvas.Pen.Mode:=pmCopy;
Img.Canvas.Pen.Style:=psSolid;
end;

Wäre sehr dankbar für einen Tipp.

himitsu 12. Nov 2024 14:04

AW: Pen.Color wird ignoriert
 
Wo sollte das denn ignoriert werden?

Es wird von DIR nirmals benutzt.
* Farbe wird zugewiesen
* und anschließend wird niemals etwas damit gemalt


Und am Anfang der Brush und FlodFill sind auch "nutzlos", da anschließend das komplette Bild durch das PNG ersetzt (versucht) wird.
Wobei, macht das
Delphi-Quellcode:
Img.Picture.Bitmap.Assign(PNG);
überhaupt etwas? Hier wird ja ein TPNGImage an ein TBitmap zugewiesen und Jenes kennt natürlich nur Eigenschaften von TBitmaps.

Uwe Raabe 12. Nov 2024 14:20

AW: Pen.Color wird ignoriert
 
Zitat:

Zitat von himitsu (Beitrag 1543051)
Hier wird ja ein TPNGImage an ein TBitmap zugewiesen und Jenes kennt natürlich nur Eigenschaften von TBitmaps.

Das funktioniert schon wie es soll. TBitmap.Assign kennt zwar kein TPngImage, aber dann leitet es das Assign eben an das inherited weiter. Im TPersistent wird es dann an das AssignTo delegiert, das in TPngImage dann die Konvertierung in TBitmap durchführt.

palmakunkel 12. Nov 2024 14:50

AW: Pen.Color wird ignoriert
 
Danke, @himitsu: es wird schon verwendet, das habe ich aber nicht in das Code-Schnipsel gepackt. Unklar ist mir, warum Pen.Color korrekt verwendet wird, wenn ich Img.Picture.LoadFromFile('Aloahe2.bmp') lade, aber nicht, wenn vorher die Konvertierung mit ConvertToBMP('Aloahe2.PNG', Img) erfolgt.

itsChris 12. Nov 2024 15:24

AW: Pen.Color wird ignoriert
 
Hi,
irgendwie verstehe ich noch nicht so richtig, was bei dir wann funktionieren soll. An welcher Stelle in deinem Code soll
Delphi-Quellcode:
 Img.Picture.LoadFromFile('Aloahe2.bmp')
stehen, damit das setzen der Pen.Eigenschaften funktioniert? Bitte benutze doch [$DELPHI]Hier dein Code[$/DELPHI], um deinen Code darzustellen (ohne das $-Zeichen).

Edit: Außerdem ist TPNGObject veraltet, TPngImage ist die neue Variante.

palmakunkel 12. Nov 2024 15:38

AW: Pen.Color wird ignoriert
 
@itsChris: TPNGObject habe ich rausgeschmissen,
@himitsu: ebenso FloodFill,
hier nochmal das Wichtigste aus dem Code:

Delphi-Quellcode:
type
   TForm1 = class(TForm)
     ...
     Img: TImage;
     ...
   end;
   
procedure ConvertToBMP(const FileName: string; var Img: TImage);
var PNG: TPNGImage;
begin
  if UpperCase(TPath.GetExtension(FileName))='.PNG' then
  begin
    PNG := TPNGImage.Create;
    try
      PNG.LoadFromFile(FileName); // Load the PNG image
      Img.Picture.Bitmap.Assign(PNG);
    finally
      PNG.Free;
    end;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  // bei folgenden Variante wird Pen.Color ignoriert
  ConvertToBMP('Aloahe2.png', Img);
 
  // bei dieser Variante klappt Pen.Color
  Img.Picture.LoadFromFile('Aloahe2.png');
  // das mache ich natürlich nicht hintereinander,
  // es steht nur zum Deutlichmachen hier
 
  Img.Canvas.Pen.Color:=clBlack;
  Img.Canvas.Pen.Mode:=pmCopy;
  Img.Canvas.Pen.Style:=psSolid;
end;

procedure TForm1.ScrMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  DrawState:=true;
  if DrawStyle= dsPen then Img.Canvas.MoveTo(X,Y);
end;    

procedure TForm1.ScrMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  if Drawstate then
   if DrawStyle=dsPen then Img.Canvas.LineTo(X,Y);
end;

palmakunkel 12. Nov 2024 15:58

AW: Pen.Color wird ignoriert
 
ein Fehler im Listing oben, in Zeile 5 im FormCreate muss es heißen:

Img.Picture.LoadFromFile('Aloahe2.BMP');

Pardon!

peterbelow 12. Nov 2024 22:47

AW: Pen.Color wird ignoriert
 
Man sollte sich nie darauf verlassen, dass ein Canvas gesetzte Properties über das Ende einer Methode hinaus behält (zumindest bei VCL-Anwendungen). Setz die Properties direkt vor dem LineTo-Statement, dann klappt es auch zuverlässig.

palmakunkel 14. Nov 2024 09:29

AW: Pen.Color wird ignoriert
 
@peterbelow: das ist ein guter Hinweis, danke, mache ich zur Sicherheit jetzt. Die Lösung des Problems ist aber gewesen, Img.Picture.Bitmap.Alphaformat:=afIgnored zu setzen. Die Procedure ConvertToBMP lautet jetzt so:

Delphi-Quellcode:
procedure ConvertToBMP(const FileName: string; var Img: TImage);
var PNG: TPNGImage;
    BMP: TBitmap;
begin
  BMP:=TBitmap.Create;
  PNG := TPNGImage.Create;
  try
    PNG.LoadFromFile(FileName);
    BMP.Assign(PNG);
    Img.Picture.Assign(BMP);
    Img.Picture.Bitmap.Alphaformat:=afIgnored;
  finally
    PNG.Free;
    BMP.Free;
  end;
end;
Vielen Dank an die Mitdenker :-D

Redeemer 15. Nov 2024 10:22

AW: Pen.Color wird ignoriert
 
Wie wär's mit Lesen der Doku? Delphi-Referenz durchsuchenTImage.Canvas soll, wie da auch ausdrücklich steht, nur genutzt werden, wenn TImage eine Bitmap enthält. (Falls TPicture nicht initialisiert ist, wird eine TBitmap erstellt.) Ist eine PNG drin, würde man
Delphi-Quellcode:
(Image.Picture.Graphic as TPNGImage).Canvas
benutzen.

TImage ist dafür gedacht, dass du Bitmaps, Metafiles or Icons drauf anzeigst. Sieht man gut an den Eigenschaften von TPicture. Alles andere geht, aber schlecht. Alternativen gibt es nicht wirklich, muss man also mit leben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:52 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