Timage-TJPEGImage-Probleme

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
CeeJay D-Magic
Beiträge: 21
Registriert: Mi 8. Sep 2010, 08:55
OS, Lazarus, FPC: Windows 7 (Lazarus 0.9.31 r35701 FPC 2.6.1 x86_64-win64-win32/win64)
CPU-Target: 32Bit/64bit

Timage-TJPEGImage-Probleme

Beitrag von CeeJay D-Magic »

Hallo,

Ich habe da ein paar Probleme mit den Timage und TJPEGImage Komponenten:

1. JPEG-Anzeigeproblem

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin  
  jpgimage := TJPEGImage.Create;
  jpgimage.LoadFromFile(FileNameEdit1.FileName);
 
      jpgimage.Canvas.Font.Style := [fsBold];
      jpgimage.Canvas.Brush.Style:=bsClear;
      jpgimage.Canvas.Font.Color := clGrayText;
      jpgimage.Canvas.Font.Size:=14;
      jpgimage.Canvas.TextOut(10, 10, 'Software');
      jpgimage.Canvas.Brush.Style:=bsClear;
      jpgimage.Canvas.Font.Color :=clNavy;
      jpgimage.Canvas.TextOut(9, 9, 'Software');
 
  Image1.Picture.Jpeg := jpgimage; //Auf die Timage-Komponente auf der Form übertragen
  Image1.Width:=Image1.Picture.Width;
  Image1.Height:=Image1.Picture.Height;
end;
Das Bild erscheint auf der Timage-Komponente, jedoch werden die erstellten Schriften hier komischerweise weiß angezeigt, speichere ich das Bild mittels

Code: Alles auswählen

Image1.Picture.Jpeg.SaveToFile(FileNameEdit2.FileName);
Wird das Bild hier in der Timage ganz normal, wird das mit der gewollten Schriftfarbe abgespeichert.
An sich nicht das Problem, jedoch wollte ich eine Vorschau haben, die so leider nicht wie gewünscht funktioniert...
Wie kann ich das beheben?

2. Wie ermittle ich die mögliche Datei-Größe eines Bildes, bevor man das abspeichert?
Ich habe eine Trackbar eingebaut, mit der man die Kompression des Bildes ändern kann und möchte, das dem User angezeigt wird, wie groß das Bild dann werden würde, da es die Größe von 250 KB nicht überschreiten darf.

Code: Alles auswählen

Image1.Picture.Jpeg.CompressionQuality:=TrackBar2.position;
Ich danke im Vorraus :)
Zuletzt geändert von CeeJay D-Magic am Fr 2. Mär 2012, 17:46, insgesamt 1-mal geändert.

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

Re: Timage-TJPEGImage-Probleme

Beitrag von theo »

1. Deine Code Schnippsel ergeben für mich keinen rechten Sinn.
2. Du kannst zuerst in einen Stream saven (SaveToStream), dann kannst du vor dem SaveToFile die Stream Grösse abfragen.

CeeJay D-Magic
Beiträge: 21
Registriert: Mi 8. Sep 2010, 08:55
OS, Lazarus, FPC: Windows 7 (Lazarus 0.9.31 r35701 FPC 2.6.1 x86_64-win64-win32/win64)
CPU-Target: 32Bit/64bit

Re: Timage-TJPEGImage-Probleme

Beitrag von CeeJay D-Magic »

1.entschuldige, da wurden 2 Zeilen verschluckt :o
Hab das aktualisiert.

2.Das savetostream() probiere ich mal aus, danke.
Edit:

Code: Alles auswählen

AStream := TStream.Create;
  Image1.Picture.Jpeg.SaveToStream(AStream);
  AStream.Free;
Der gibt mir den fehler "Writing to TStream is not supportet" aus. O.o
Wo ist da mein Denkfehler?

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

Re: Timage-TJPEGImage-Probleme

Beitrag von theo »

TStream ist ja auch eine Basisklasse die man so nicht verwenden kann.
Du musst dich für eine konkrete Ableitung entscheiden. Hier TMemoryStream.

CeeJay D-Magic
Beiträge: 21
Registriert: Mi 8. Sep 2010, 08:55
OS, Lazarus, FPC: Windows 7 (Lazarus 0.9.31 r35701 FPC 2.6.1 x86_64-win64-win32/win64)
CPU-Target: 32Bit/64bit

Re: Timage-TJPEGImage-Probleme

Beitrag von CeeJay D-Magic »

Danke, es funktioniert, aber nur genau ein mal :o

Code: Alles auswählen

procedure TForm1.TrackBar2MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  AStream: TMemoryStream;
begin   
  AStream := TMemoryStream.Create;
  Image1.Picture.Jpeg.CompressionQuality:=TrackBar2.position;
  Image1.Picture.Jpeg.SaveToStream(AStream);
  caption := FormatByteSize(AStream.Size);
  AStream.Free;
end;
danach kann ich an der Trackbar ändern wie ich will, die Größe wird immer gleich angezeigt.
Ausser ich starte das Programm neu, dann zeigt er mir entsprechend dem Kompressionsgrad die neue Größe an, aber wiederum nur ein mal.

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

Re: Timage-TJPEGImage-Probleme

Beitrag von theo »

Ja, die Kompression ist in der LCL schlicht nicht umgesetzt. Benutze die Freepascal Units:

Code: Alles auswählen

uses FPWriteJPEG, IntfGraphics;  
 
procedure TForm1.Button1Click(Sender: TObject);
var
  sizekb: String;
  AStream: TMemoryStream;
  jpeg:TFPWriterJPEG;
  img:TLazIntfImage;
begin
  AStream := TMemoryStream.Create;
  jpeg:=TFPWriterJPEG.Create;
  jpeg.CompressionQuality:=TrackBar2.position;
  img:=Image1.Picture.Bitmap.CreateIntfImage;
  img.SaveToStream(AStream,jpeg);
  img.free;
  caption := inttostr(AStream.Size);
  jpeg.free;
  AStream.Free;
end;

CeeJay D-Magic
Beiträge: 21
Registriert: Mi 8. Sep 2010, 08:55
OS, Lazarus, FPC: Windows 7 (Lazarus 0.9.31 r35701 FPC 2.6.1 x86_64-win64-win32/win64)
CPU-Target: 32Bit/64bit

Re: Timage-TJPEGImage-Probleme

Beitrag von CeeJay D-Magic »

Wunderbar! Danke theo!

Habe mal eine Funktion daraus gebastelt:

Code: Alles auswählen

function getTmpJpegCompressionSize(compression: integer; img: TLazIntfImage): integer;
var
  sizekb: String;
  AStream: TMemoryStream;
  jpeg: TFPWriterJPEG;
begin
  AStream := TMemoryStream.Create;
  jpeg:=TFPWriterJPEG.Create;
  jpeg.CompressionQuality:=compression;
  img.SaveToStream(AStream,jpeg);
  img.free;
  result := AStream.Size;
  jpeg.free;
  AStream.Free;
end;
Und es funktioniert sehr gut :)

Aber um auf das erste Problem zurück zu kommen.
Gibt es noch Möglichkeiten eine jpg zu öffnen, per canvas zu bearbeiten, ohne das es hinterher im Vorschaubild (TImage o. doch eher ein anderes?) Falsch dargestellt wird? Komischerweise wenn man das Bild speichert wird es richtig abgespeichert, nur angezeigt wird es falsch - Wie kommt das?
Dabei ist es egal, ob ich das direkt per Timage lade und bearbeite oder erst ein TJPEGImage erstelle und es darüber mache...

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

Re: Timage-TJPEGImage-Probleme

Beitrag von theo »

Weiss nicht, bei mir sieht's normal aus

Lazarus 0.9.31 r35593M FPC 2.6.0 x86_64-linux-gtk 2

CeeJay D-Magic
Beiträge: 21
Registriert: Mi 8. Sep 2010, 08:55
OS, Lazarus, FPC: Windows 7 (Lazarus 0.9.31 r35701 FPC 2.6.1 x86_64-win64-win32/win64)
CPU-Target: 32Bit/64bit

Re: Timage-TJPEGImage-Probleme

Beitrag von CeeJay D-Magic »

Habe mal gerade auf Lazarus 0.9.31 r35701 FPC 2.6.1 x86_64-win64-win32/win64 geupdated, allerdings ist das genau das gleiche:

Code: Alles auswählen

type
Image1: TImage;
 
begin
Image1.Picture.LoadFromFile(FileNameEdit1.FileName);
 
      Image1.picture.jpeg.Canvas.Font.Style := [fsBold];
      Image1.picture.jpeg.Canvas.Brush.Style:=bsClear;
      Image1.picture.jpeg.Canvas.Font.Color := clYellow;
      Image1.picture.jpeg.Canvas.Font.Size:=14;
      Image1.picture.jpeg.Canvas.TextOut(10, 10, 'Software');
      Image1.picture.jpeg.Canvas.Brush.Style:=bsClear;
      Image1.picture.jpeg.Canvas.Font.Color :=clNavy;
      Image1.picture.jpeg.Canvas.TextOut(9, 9, 'Software');
end;
Die Schrift bleibt grau...
Außer ich speichere es

Code: Alles auswählen

Image1.Picture.Jpeg.SaveToFile(FileNameEdit2.FileName);
Dann wird es in der gespeicherten Datei richtig angezeigt.

Aber ich brauche eine Vorschau davon :(

CeeJay D-Magic
Beiträge: 21
Registriert: Mi 8. Sep 2010, 08:55
OS, Lazarus, FPC: Windows 7 (Lazarus 0.9.31 r35701 FPC 2.6.1 x86_64-win64-win32/win64)
CPU-Target: 32Bit/64bit

Re: Timage-TJPEGImage-Probleme

Beitrag von CeeJay D-Magic »

Ich habe noch ein Problem gefunden...
Wenn ich die Kompression einstelle, interessiert das der Timage, sowie der TJPEGImage Komponente herzlich wenig...
Es bleibt, so wie ich das bisher gesehen habe, bei 75% - Standarteinstellung vermute ich mal...

Code: Alles auswählen

jpgimage.CompressionQuality:=TrackBar2.position;
jpgimage.SaveToFile(FileNameEdit2.FileName);
Ist das so überhaupt richtig?

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

Re: Timage-TJPEGImage-Probleme

Beitrag von theo »

Ja logisch, die Kompression geschieht ja beim speichern in File/Stream.
Wenn du den Qualitätsverlust sehen willst, musst du natürlich neu laden.

CeeJay D-Magic
Beiträge: 21
Registriert: Mi 8. Sep 2010, 08:55
OS, Lazarus, FPC: Windows 7 (Lazarus 0.9.31 r35701 FPC 2.6.1 x86_64-win64-win32/win64)
CPU-Target: 32Bit/64bit

Re: Timage-TJPEGImage-Probleme

Beitrag von CeeJay D-Magic »

Entschuldigung, ich habe mich blöd ausgedrückt:
Ich meinte, das die Dateigröße im Ordner immer gleich bleibt und wenn ich die Datei direkt im Bildbearbeitungsprogramm öffne, stelle ich auch keinen unterschied fest. Sie ist aber dennoch kleiner als das Original, eine Kompression muss stattgefunden haben, aber auf Defaultwert 75% und da ändert sich nichts dran, egal auf was ich "CompressionQuality" stelle...

CeeJay D-Magic
Beiträge: 21
Registriert: Mi 8. Sep 2010, 08:55
OS, Lazarus, FPC: Windows 7 (Lazarus 0.9.31 r35701 FPC 2.6.1 x86_64-win64-win32/win64)
CPU-Target: 32Bit/64bit

Re: Timage-TJPEGImage-Probleme

Beitrag von CeeJay D-Magic »

Ach ich bin doof ;)
Ist ja im Grunde dasselbe Problem wie es schon oben Stand...

ein wenig Modifiziert:

Code: Alles auswählen

function savePicture(compression: integer; img: TLazIntfImage; Destination: String): boolean;
var
  AStream: TMemoryStream;
  jpeg: TFPWriterJPEG;
begin
  Try
    AStream := TMemoryStream.Create;
    jpeg:=TFPWriterJPEG.Create;
    jpeg.CompressionQuality:=compression;
    img.SaveToStream(AStream,jpeg);
    img.free;
    AStream.SaveToFile(Destination);
    jpeg.free;
    AStream.Free;
    result := true;
  except
    result := false;
  end;
end;
Funktioniert auch das :D

Danke dir Theo :)

Antworten