Png-Bild laden und zeichnen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
400kmh
Beiträge: 100
Registriert: Do 25. Mär 2010, 04:03

Png-Bild laden und zeichnen

Beitrag von 400kmh »

Hallo, ich weiß wie man ein bmp-Bild lädt und zeichnet, ich würde aber lieber png-Bilder verwenden, da diese weniger Speicherplatz brauchen.

Was muss ich an folgendem Code ändern, damit es mit einem png-Bild funktioniert?

Code: Alles auswählen

uses Graphics
 
...
 
Bitmap1:=TBitmap.Create;
Bitmap1.LoadFromFile(Verzeichnis+'Bild.bmp');
Form1.Canvas.Draw(0, 0, Bitmap1);

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: Png-Bild laden und zeichnen

Beitrag von wp_xyz »

Wenn du sicher bist, dass es sich beim dem Bild immer um ein png handelt, kannst du einfach TBitmap gegen TPortableNetworkGraphic ersetzen (die Variable Bitmap1 nenne ich mal ins allgemeinere "Bild" um):

Code: Alles auswählen

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormPaint(Sender: TObject);
  private
    Bild: TPortableNetworkGraphic;
  public
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  Bild:=TPortableNetworkGraphic.Create;
  Bild.LoadFromFile('C:\lazarus\images\splash_source\paw.png');
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
  Bild.Free;
end;
 
procedure TForm1.FormPaint(Sender: TObject);
begin
  Canvas.Draw(0, 0, Bild);   // Nicht den Formularnamen verwenden, sonst funktioniert das Programm nur, wenn die Instanz von TForm1 Form1 heißt!
end;

Wenn auch andere Formate in Frage kommen, nimmst du am besten TPicture, denn dieses ermittelt das Format automatisch. Bei der Ausgabe musst du dann auf das Feld Bitmap von TPicture verweisen:

Code: Alles auswählen

 
  Bild: TPicture;
,,,
  Bild := TPicture.Create;
...
  Canvas.Draw(0, 0, Bild.Bitmap);

400kmh
Beiträge: 100
Registriert: Do 25. Mär 2010, 04:03

Re: Png-Bild laden und zeichnen

Beitrag von 400kmh »

Danke, funktioniert soweit.

Kann es sein, dass es Probleme dabei gibt, mit Canvas etwas auf eine PortableNetworkGraphic zu zeichnen (anders als auf Bitmaps kann ich nur in grau zeichnen), und dass man auf TPictures garnichts mit Canvas zeichnen kann?

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: Png-Bild laden und zeichnen

Beitrag von wp_xyz »

400kmh hat geschrieben:Kann es sein, dass es Probleme dabei gibt, mit Canvas etwas auf eine PortableNetworkGraphic zu zeichnen (anders als auf Bitmaps kann ich nur in grau zeichnen), und dass man auf TPictures garnichts mit Canvas zeichnen kann?

Da png einen Alphakanal unterstützt, das 4.Byte von TColor aber immer mit 0 an den Canvas übergeben wird, zeichnest du also transparent. Dazu gab es vor kurzem eine Diskussion: viewtopic.php?f=55&t=10151 - letzter Beitrag. Hier wird gezeigt, dass man mit Hilfe eines lazintfImage durchaus in einem png-Bild malen kann. Mit einem lazcanvas kann man sogar die üblichen Canvas-Routinen verwenden (hier und da etwas eingeschränkt):

Code: Alles auswählen

procedure TForm1.Button8Click(Sender: TObject);
var
  png: TPortableNetworkGraphic;
  lazintfimg: TLazIntfImage;
  lazcanvas: TLazCanvas;
begin
  png := TPortableNetworkGraphic.Create;
  try
    png.LoadFromFile('border-color.png')// eines der fugue-icons (http://p.yusukekamiyamane.com/icons/preview/fugue.png)
    lazintfimg := png.CreateIntfImage;
    try
      lazcanvas := TLazCanvas.Create(lazintfimg);
      try
        lazcanvas.Brush.FPColor := colBlue;
        lazcanvas.Brush.Style := bsSolid;
        lazcanvas.FillRect(0, lazintfimg.Height-3, lazintfimg.Width, lazintfimg.Height-1);
        png.LoadFromIntfImage(lazintfimg);
      finally
        lazcanvas.Free;
      end;
    finally
      lazintfimg.Free;
    end;
    //png.saveToFile('d:\test.png');
    Image1.Picture.Png.Assign(png);
  finally
    png.Free;
  end;
end;

400kmh
Beiträge: 100
Registriert: Do 25. Mär 2010, 04:03

Re: Png-Bild laden und zeichnen

Beitrag von 400kmh »

Mit LazCanvas komme ich nicht wirklich klar. Das benutzt z. B. FPColor statt Color, aber eine Funktion wie "RGBToFPColor" finde ich nicht. Wenn da alles anderes ist, lasse ich es wohl lieber.

Ich neige dazu, mir das aus einer PNG erstellte LazIntfImage per Bitmap.LoadFromIntfImage auf eine Bitmap zu holen, und dort einfach mit Canvas zu arbeiten. So dürfte das Programm wohl etwas langsamer sein, aber immerhin wären die Bilder trotzdem in png-Dateien gespeichert, sodass nicht so viel Speicherplatz verbraucht würde.

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: Png-Bild laden und zeichnen

Beitrag von wp_xyz »

400kmh hat geschrieben:Mit LazCanvas komme ich nicht wirklich klar. Das benutzt z. B. FPColor statt Color, aber eine Funktion wie "RGBToFPColor" finde ich nicht.

Aber eine Funktion TColorToFPColor, und umgekehrt FPColorToTColor, gibt es (in graphics).

Antworten