Lazreport Bilder drehen
Lazreport Bilder drehen
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
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
Re: Lazreport Bilder drehen
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:
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;
Re: Lazreport Bilder drehen
Vielen Dank! Funktioniert.
(Braucht nur leider seine Zeit bis die Bilder gedreht sind. Vielleicht find ich später noch eine schnellere Methode.)
(Braucht nur leider seine Zeit bis die Bilder gedreht sind. Vielleicht find ich später noch eine schnellere Methode.)
-
- 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
Das TLazIntfImage kannte ich nicht, ich musste gerade feststellen,das dies sehr viel schneller als TBitmap ist.
Der Code
Ist über 20x langsamer als der oben beschriebene.
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 ?
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;

Code: Alles auswählen
Zeit RotateBitmap: 171
Zeit Rot: 4025
Zeit RotateBitmap: 156
Zeit Rot: 402
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
Mit Java und C/C++ sehe ich rot
-
- 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
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 ?
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
Mit Java und C/C++ sehe ich rot