Lazreport Bilder drehen

Rund um die LCL und andere Komponenten
Antworten
plantus
Beiträge: 2
Registriert: Mi 31. Dez 2014, 16:04

Lazreport Bilder drehen

Beitrag von plantus »

Hallo,
wie ist es möglich Bilder auf einem Report zu drehen?

Die Bilder stammen aus DBFeldern bzw. Dateien und sind dort auch richtig rum gedreht sodass die Verwndung im Normalfall sehr gut funktioniert..
Leider gibt es jedoch einen Report für Etiketten mit Laufrichtungsvorgabe und dafür brauch ich die 90°Dehung.

(Bei text und Barcode is dies ja kein Problem für Bilder hab ich jedoch keine Möglichkeit zur Drehung in Lazreport gefunden)

Vielen Dank!
plantus

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

Re: Lazreport Bilder drehen

Beitrag von Michl »

Ich kenn mich zwar mit Lazreport nicht so gut aus. Doch wenn es keine vorgefertigte Möglichkeit gibt, könntest Du ja auch selber drehen.

Ich habe es mal kurz probiert:

Code: Alles auswählen

uses ...  LR_Class, Graphics, IntfGraphics, LCLType;  
...
procedure RotateBitmap(const Bitmap: TBitmap);
var
  TempBitmap: TBitmap;
  IntfImg, TempIntfImg: TLazIntfImage;
  ImgHandle, ImgMaskHandle: HBITMAP;
  i, j: integer;
begin
  TempBitmap:=TBitmap.Create;
  TempBitmap.PixelFormat:=pf24bit;
  TempBitmap.Width:=Bitmap.Height;
  TempBitmap.Height:=Bitmap.Width;
  TempIntfImg:=TLazIntfImage.Create(0, 0);
  TempIntfImg.LoadFromBitmap(TempBitmap.Handle, TempBitmap.MaskHandle);
  IntfImg:=TLazIntfImage.Create(0, 0);
  IntfImg.LoadFromBitmap(Bitmap.Handle, Bitmap.MaskHandle);
  for i:=0 to Bitmap.Width - 1 do
    for j:=0 to Bitmap.Height - 1 do
      TempIntfImg.Colors[j, i]:=IntfImg.Colors[i, j];
  TempIntfImg.CreateBitmaps(ImgHandle, ImgMaskHandle, false);
  TempBitmap.Handle:=ImgHandle;
  TempBitmap.MaskHandle:=ImgMaskHandle;
  TempIntfImg.free;
  Bitmap.Assign(TempBitmap);
  TempBitmap.free;
  IntfImg.free;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  Foto : TfrPictureView;
begin
  frReport1.Pages.Clear;
  frReport1.Pages.Add();
  Foto:=TfrPictureView.Create(frReport1.Pages[0]);
  Foto.Width :=400;
  Foto.Height:=400;
  Foto.Left  :=10;
  Foto.Top   :=40;
  Foto.Picture.LoadFromFile('001.jpg');
  RotateBitmap(Foto.Picture.Bitmap);
  frReport1.ShowReport;
end; 

Code: Alles auswählen

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

plantus
Beiträge: 2
Registriert: Mi 31. Dez 2014, 16:04

Re: Lazreport Bilder drehen

Beitrag von plantus »

Vielen Dank! Funktioniert.

(Braucht nur leider seine Zeit bis die Bilder gedreht sind. Vielleicht find ich später noch eine schnellere Methode.)

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

Re: Lazreport Bilder drehen

Beitrag von Mathias »

Das TLazIntfImage kannte ich nicht, ich musste gerade feststellen,das dies sehr viel schneller als TBitmap ist.

Der Code

Code: Alles auswählen

procedure Rot(const Bitmap: TBitmap);
var
  x, y: integer;
  bit: TBitmap;
begin
  bit := TBitmap.Create;
  bit.Width := Bitmap.Height;
  bit.Height := Bitmap.Width;
  for x := 0 to Bitmap.Width - 1 do begin
    for y := 0 to Bitmap.Height - 1 do begin
      bit.Canvas.Pixels[y, x] := Bitmap.Canvas.Pixels[x, y];
    end;
  end;
  Bitmap.Assign(bit);
  bit.Free;
end;   
Ist über 20x langsamer als der oben beschriebene. :shock:

Code: Alles auswählen

Zeit RotateBitmap: 171
Zeit Rot: 4025
Zeit RotateBitmap: 156
Zeit Rot: 402
Ich habe den Test mit einer TImage mit Alpha-Belding gemacht.
Nur leider geht mit RotateBitmap und Rot der Alpha-Kanal verloren.
Kann man dies auch irgendwie umgehen ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Lazreport Bilder drehen

Beitrag von Mathias »

Wen ich die Zeile TempBitmap.PixelFormat:=pf24bit; durch TempBitmap.PixelFormat:=TBitmap.PixelFormat; ersetze geht es auch mit dem Alpha-Kanal.

Da hätte ich noch eine Frage, wieso kann ich Colors nicht durch Pixels ersetzen ?

Code: Alles auswählen

TempIntfImg.Colors[j, i]:=IntfImg.Colors[i, j];  // alt
TempIntfImg.Pixels[j, i]:=IntfImg.Pixels[i, j];  // neu
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot


Antworten