JPG-Bild um 90 Grad drehen

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
Fraenzken
Beiträge: 24
Registriert: Mi 10. Feb 2016, 10:30

JPG-Bild um 90 Grad drehen

Beitrag von Fraenzken »

Hallo,

ich mache gerade meine ersten Schritten in der Bildbearbeitung mit Lazarus.
Ich habe ein kleines Konsolenprogramm geschrieben, um ein JPG-Bild auf der Festplatte um 90° zu drehen:

Code: Alles auswählen

program Drehen;
 
{$mode objfpc}{$H+}
 
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes, Graphics, GraphType, IntfGraphics
  { you can add units after this };
 
var
  Bild        : TPicture;
  Bmp         : TBitmap;
  Help1, Help2: TLazIntfImage;
  x, y        : INTEGER;
 
begin
  Bild := TPicture.Create;
  Bmp  := TBitmap.Create;
  Bild.LoadFromFile ('C:\Users\Frank Luerweg\Desktop\Fisheye\Test\t.jpg');
  Bmp  := Bild.Bitmap;
 
  Help1 := Bmp.CreateIntfImage;
  Help2 := TLazIntfImage.Create (Help1.Height, Help1.Width);
 
  FOR x := 0 TO Help1.Width-1 DO
    FOR y := 0 TO Help1.Height-1 DO
      BEGIN
        Help2.Colors[x,y] := Help1.Colors[y,x];
      end;
 
  Bmp.LoadFromIntfImage(Help2);
  Bild.Bitmap := Bmp;
  Bild.SaveToFile ('C:\Users\Frank Luerweg\Desktop\Fisheye\Test\t_90.jpg');
  Bild.Free;
  Bmp.Free;
end


Es wird kompiliert, produziert dann aber den Laufzeit-Fehler "No widgetset object". Beim Googlen habe ich dazu nichts gefunden; könnt ihr mir sagen, was ich falsch mache? Vielen Dank!

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: JPG-Bild um 90 Grad drehen

Beitrag von Socke »

Nimm die Unit Interfaces mit auf; damit wird das eingestellte Widgetset geladen (wird von der Unit Graphics verwendet).
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Fraenzken
Beiträge: 24
Registriert: Mi 10. Feb 2016, 10:30

Re: JPG-Bild um 90 Grad drehen

Beitrag von Fraenzken »

Socke hat geschrieben:Nimm die Unit Interfaces mit auf; damit wird das eingestellte Widgetset geladen (wird von der Unit Graphics verwendet).

Danke, hat geklappt. Jetzt bekomme ich aber einen anderen Laufzeitfehler - eine "FPImageException": "failed to create handles". :(

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

Re: JPG-Bild um 90 Grad drehen

Beitrag von theo »

Für die Konsole würde ich das ohne LCL Abhängigkeit machen. Graphics, Interfaces etc. brauchst du nicht.
So reicht völlig:

Code: Alles auswählen

program Project1;
 
uses
  Classes,
  SysUtils,
  FPImage,
  FPWriteJPEG,
  FPReadJPEG;
 
var
  Image, Image2: TFPCustomImage;
  Writer: TFPCustomImageWriter;
  Reader: TFPCustomImageReader;
  X, Y: integer;
begin
  Image := TFPMemoryImage.Create(100, 100);
  Writer := TFPWriterJPEG.Create;
  Reader := TFPReaderJPEG.Create;
  Image.LoadFromFile('test.jpg', Reader);
  Image2 := TFPMemoryImage.Create(Image.Height, Image.Width);
  for X := 0 to Image.Width - 1 do
    for Y := 0 to Image.Height - 1 do
    begin
      Image2.Colors[Y, X] := Image.Colors[X, Y];
    end;
  Image2.SaveToFile('test1.jpg', writer);
  Image.Free;
  Image2.Free;
  Writer.Free;
  Reader.Free;
end.

Fraenzken
Beiträge: 24
Registriert: Mi 10. Feb 2016, 10:30

Re: JPG-Bild um 90 Grad drehen

Beitrag von Fraenzken »

theo hat geschrieben:Für die Konsole würde ich das ohne LCL Abhängigkeit machen. Graphics, Interfaces etc. brauchst du nicht.
So reicht völlig:

Code: Alles auswählen

program Project1; ...
 


Vielen Dank, Theo; funktioniert super!
Kennst du einen Trick, um die Drehung zu beschleunigen? Lassen sich z.B. ganze Zeilen auf einmal kopieren?

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

Re: JPG-Bild um 90 Grad drehen

Beitrag von theo »

Wenn du sie drehen musst, wie soll das gehen?

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

Re: JPG-Bild um 90 Grad drehen

Beitrag von wp_xyz »

In der c't stand vor (sehr) langer Zeit einmal ein Artikel über verlustlose JPEG-Rotation, das dürfte schneller sein, und - vor allem - verhindert es den Qualitätsverlust beim erneuten Komprimieren des JPEG-Bildes. In der Graphik-Bibliothek FreeImage (http://freeimage.sourceforge.net/index.html) ist dies implementiert. Sollte unter Lazarus laufen, allerdings holst du dir dadurch die Abhängigkeit von einer externen DLL mit ins Projekt.

Fraenzken
Beiträge: 24
Registriert: Mi 10. Feb 2016, 10:30

Re: JPG-Bild um 90 Grad drehen

Beitrag von Fraenzken »

Danke euch beiden. Ich habe es erst einmal so gelassen, wie Theo es vorgeschlagen hat.

Antworten