[Gelöst] Wie erstellt man mit Konsolenprogramm ein PNG?

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
kirchfritz
Beiträge: 172
Registriert: Mo 3. Jan 2011, 13:34
OS, Lazarus, FPC: Win10 (L 3.0 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Nürnberg

[Gelöst] Wie erstellt man mit Konsolenprogramm ein PNG?

Beitrag von kirchfritz »

Hallo,
ich stehe mal wieder auf dem Schlauch und weiß nicht weiter.
Mein Konsolenprogramm soll eine PNG-Datei mit vorgegebener Größe erstellen.
Leider stürzt das Programm mit einem SIGSEGV Fehler ab, wenn ich die Höhe und Breite des PNG-Bildes setzen will.
Was mache ich verkehrt?


Code: Alles auswählen

 
  MyPNG := TPortableNetworkGraphic.Create;
  try
    MyPNG.Height := 200;
    MyPNG.Width  := 400;
    MyPNG.SaveToFile(PNGFilename);
  finally
    MyPNG .Free;
  end;     
 
Zuletzt geändert von kirchfritz am Mo 31. Okt 2016, 19:02, insgesamt 1-mal geändert.

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

Re: Wie erstellt man mit Konsolenprogramm ein PNG?

Beitrag von Mathias »

So geht es bei mir, du muss noch die Unit Interfaces hinzufügen.
Ich denke, die Packages LCL hast du hinzugefügt, ansonsten würde die Unit Graphics nicht gefunden werden.

Code: Alles auswählen

program Project1;
uses
  Interfaces,
  Graphics;
 
  procedure test;
  var
    MyPNG: TPortableNetworkGraphic;
  begin
    MyPNG := TPortableNetworkGraphic.Create;
    try
      MyPNG.Height := 200;
      MyPNG.Width := 400;
      MyPNG.SaveToFile('/n4800/test.png');
    finally
      MyPNG.Free;
    end;
  end;
 
begin
  test;
end.   
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

kirchfritz
Beiträge: 172
Registriert: Mo 3. Jan 2011, 13:34
OS, Lazarus, FPC: Win10 (L 3.0 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Nürnberg

[Gelöst] Wie erstellt man mit Konsolenprogramm ein PNG?

Beitrag von kirchfritz »

Vielen Dank. Es funktioniert.

Ich hatte nur die LCLbase inkludiert.
Die Unit Interfaces kenne ich nicht, und wäre auch nicht im Traum darauf gekommen, sie miteinzubinden.
Die unit Interfaces kennt er auch nur, weil ich noch zusätzlich zur LCLBase die unit LCL in die Abhängigkeiten mitaufnehmen musste.

Wie gesagt. Danke nochmal für die schnelle Hilfe.

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

Re: [Gelöst] Wie erstellt man mit Konsolenprogramm ein PNG?

Beitrag von Mathias »

Die Unit Interfaces kenne ich nicht, und wäre auch nicht im Traum darauf gekommen, sie miteinzubinden.

Auf die Idee bin ich gekommen, weil sie in der Project-Datei einer normalen Lazarus-Anwendung auch eingebunden ist.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: [Gelöst] Wie erstellt man mit Konsolenprogramm ein PNG?

Beitrag von theo »

Man muss allerdings sagen, das dies nicht funktioniert, wenn kein X-Server o.ä. da ist.

Für eine Dienstanwendung oder afaik auch in einem Multi Threading Szenario müsste man auf fpImage oder OpBitmap ausweichen.

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

Re: [Gelöst] Wie erstellt man mit Konsolenprogramm ein PNG?

Beitrag von wp_xyz »

Außerdem holt man sich mit LCL eine Menge Code mit ins Programm, der für die Konsole nicht benötigt wird. Der oben gepostete Code kommt (nach Strippen der Debuggerinfos) auf 1.5 KB, der folgende (ohne LCL) nur auf 236B (das Beispiel stammt aus diesem wiki: http://wiki.freepascal.org/fcl-image):

Code: Alles auswählen

program Project1_nolcl;
 
{$mode objfpc}{$H+}
 
uses
  FPImage, FPCanvas, FPImgCanv,
  FPWritePNG;
 
var
  canvas: TFPCustomCanvas;
  image: TFPCustomImage;
  writer: TFPCustomImageWriter;
 
begin
  { Create an image 100x100 pixels}
  image := TFPMemoryImage.Create(400, 200);
 
  { Attach the image to the canvas }
  Canvas := TFPImageCanvas.Create(image);
 
  { Create the writer }
  Writer := TFPWriterPNG.Create;
 
  { Save to file }
  image.SaveToFile('d:\test.png', writer);
 
  { Clean up! }
  Canvas.Free;
  image.Free;
  writer.Free;
end.

Antworten