Jpg Canvas pen.color

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
arturx
Beiträge: 140
Registriert: Fr 21. Nov 2008, 11:29
OS, Lazarus, FPC: Winux (L 1.0.6.xy FPC 2.6.z)
CPU-Target: 32/64Bit

Jpg Canvas pen.color

Beitrag von arturx »

In eine Image komponente wird eine Datei geladen und durch sie angezeigt.
Direkt in die bitmap der Image komponente wird eine Linie gezeichnet.
Mit einer BMP-Datei funktioniert das wie erwartet, mit einer jpeg Datei sieht man nur einen weißen (statt gelben) Strich.
Ist das ein Fehler oder muss ich für jpeg Dateien etwas hinzufügen ?

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
      var canv : tcanvas;
          w,: integer;
     begin
          Image1.Stretch:= true;
          image1.Picture.Clear;
          If checkbox1.checked
             then Image1.Picture.LoadFromFile('firmenlogo.jpg') // funktioniert nicht
             else Image1.Picture.LoadFromFile('firmenlogo.bmp'); // funktioniert
          w    := image1.Picture.width; // changed by "loadfromfile"
          h    := image1.Picture.height; // changed by "loadfromfile"
          canv := image1.Picture.Bitmap.canvas;
          canv.Pen.Color := clyellow;
          canv.pen.style := pssolid;
          canv.pen.width := h div 20;
          canv.line(1,1,w,h);
   end;

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

Re: Jpg Canvas pen.color

Beitrag von theo »

Kann das Problem nicht nachvollziehen auf Lazarus 1.1 r37322M FPC 2.7.1 x86_64-linux-gtk 2

arturx
Beiträge: 140
Registriert: Fr 21. Nov 2008, 11:29
OS, Lazarus, FPC: Winux (L 1.0.6.xy FPC 2.6.z)
CPU-Target: 32/64Bit

Re: Jpg Canvas pen.color

Beitrag von arturx »

1.Ich nutze Lazarus 0.9.30 fpc 2.4.2 SVN release 29749 unter i386-win32/win64
2.Zum Testen lade ich gern die beiden Bilddateien und Screenshots hoch.

Aber : wie bringe ich sie zum Forum ?? (Hilfe!!)

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

Re: Jpg Canvas pen.color

Beitrag von theo »

:?: Wie wär's mit "Dateianhang hochladen" ?

arturx
Beiträge: 140
Registriert: Fr 21. Nov 2008, 11:29
OS, Lazarus, FPC: Winux (L 1.0.6.xy FPC 2.6.z)
CPU-Target: 32/64Bit

Re: Jpg Canvas pen.color

Beitrag von arturx »

jpg_dateien.zip
(4.07 MiB) 91-mal heruntergeladen
"Dateianhang hochladen".... Prächtige Idee, danke !

1.das OriginalBild : Firmenlogo.jpg
(die Datei "Firmenlogo.bmp" war größer als die erlaubte Dateigröße für Anhänge.
sie lässt sich mit einem Bildbearbeitungsprogramm leicht rekonstruieren aus Firmenlogo.jpg)
2.die beiden Screenshots : bmp_image_out.jpg und jpg_image_out.jpg
(Ich hoffe der Administrator erschlägt mich nicht wegen der Dateigröße.....)
Zuletzt geändert von arturx am So 3. Jun 2012, 11:24, insgesamt 1-mal geändert.

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: Jpg Canvas pen.color

Beitrag von Heinrich Wolf »

Hallo,

ich nehme an, Dein Image1 ist ein TImage, das Du auf ein Form gezogen hast. Wenn es um Delphi ginge, würde ich sagen, In TImage kannst Du kein *.jpg rein laden. Du brauchst die Unit JPeg und ein TJpegImage und musst das JpegImage nach dem Laden an die Image1 zuweisen.

Code: Alles auswählen

{$ifndef fpc}
Uses Jpeg;
{$endif}
 
procedure TForm1.Button2Click(Sender: TObject);     
var canv : tcanvas;         
    w,: integer;
    JpegImage : tJpegImage;
begin         
  Image1.Stretch:= true;         
  image1.Picture.Clear;         
  If checkbox1.checked then
    begin
      JpegImage := TJpegImage.Create;
      JpegImage.LoadFromFile('firmenlogo.jpg');
      Image1.Picture.Bitmap.Assign(JpegImage);
      JpegImage.Free;
    end
  else
    Image1.Picture.LoadFromFile('firmenlogo.bmp');
  w    := image1.Picture.width; // changed by "loadfromfile"         
  h    := image1.Picture.height; // changed by "loadfromfile"         
  canv := image1.Picture.Bitmap.canvas;         
  canv.Pen.Color := clyellow;         
  canv.pen.style := pssolid;         
  canv.pen.width := h div 20;         
  canv.line(1,1,w,h);


Aber in Lazarus ändert mein Code nichts, eine Unit Jpeg gibt's da nicht und braucht man nicht und in Lazarus lässt sich das *.jpg auch in TImage rein laden.

Ich hab geänderte Windows Farben. Meine TForm.Color ist hellgrün und bei *.jpg ist auch der Strich hellgrün, also eigentlich transparent. Warum, weiß ich noch nicht. Ich hab auf Lazarus 1.1, fpc 2.7.1 und WinXP getestet.

Aber folgender Workaround macht Schluss mit der Transparenz:

Code: Alles auswählen

procedure TForm1.Button3Click(Sender: TObject);
      var canv : tcanvas;
          w,: integer;
          JpegImage : tJpegImage;
     begin
          Image1.Stretch:= true;
          image1.Picture.Clear;
          If checkbox1.checked then
            begin
              JpegImage := TJpegImage.Create;
              JpegImage.LoadFromFile('firmenlogo.jpg');
              image1.Picture.Bitmap.width  := JpegImage.Width;
              image1.Picture.Bitmap.height := JpegImage.Height;
              Image1.Picture.Bitmap.Canvas.Draw(0, 0, JpegImage);
              JpegImage.Free;
            end
          else
            Image1.Picture.LoadFromFile('firmenlogo.bmp'); // funktioniert
          w    := image1.Picture.width; // changed by "loadfromfile"
          h    := image1.Picture.height; // changed by "loadfromfile"
          canv := image1.Picture.Bitmap.canvas;
          canv.Pen.Color := clyellow;
          canv.pen.style := pssolid;
          canv.pen.width := h div 20;
          canv.line(1,1,w,h);
     end;

Gruß
Heiner
Zuletzt geändert von Heinrich Wolf am So 3. Jun 2012, 17:56, insgesamt 2-mal geändert.

arturx
Beiträge: 140
Registriert: Fr 21. Nov 2008, 11:29
OS, Lazarus, FPC: Winux (L 1.0.6.xy FPC 2.6.z)
CPU-Target: 32/64Bit

Re: Jpg Canvas pen.color

Beitrag von arturx »

1."Transparenz" scheint wirklich der Schlüssel zu sein.
    Vielleicht wird diese durch das Laden der jpg Datei automatisch eingeschaltet.

Bleibt also die Frage : wie schaltet man diese Transparenz aus/ein ?

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: Jpg Canvas pen.color

Beitrag von Heinrich Wolf »

Hi Artur,

ich hab vergeblich

Code: Alles auswählen

Image1.Transparent := False;
versucht.
Aber in meinem obigen Post hab ich weiter geschrieben und einen Workaround für Dich.

Gruß
Heiner

arturx
Beiträge: 140
Registriert: Fr 21. Nov 2008, 11:29
OS, Lazarus, FPC: Winux (L 1.0.6.xy FPC 2.6.z)
CPU-Target: 32/64Bit

Re: Jpg Canvas pen.color

Beitrag von arturx »

Danke Heinrich !

Der Workaround funktioniert perfekt.

image1.transparent kannte ich auch, aber (wie Du auch schreibst) tut das nix.
Der eigentliche Sinn meiner Frage war : Was muss man schreiben, damit es so funktioniert, wie man es von image.transparent erwarten würde....
Der workaround verlagert die Aufgabe image.loadfromfile zu jpegimage.loadfromfile und funktioniert deshalb.
Bleiben die Fragen :
1.Müsste man nicht das Verhalten des tImage als Bug melden ?
2.Wie kommt man auf jpegimage (ich kannte es vorher nicht) und warum gibt es das nicht als Komponente ?
(Ist für mich jetzt nicht mehr so kritisch, da ich nun die Kombi image/jpegimage kenne).

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

Re: Jpg Canvas pen.color

Beitrag von theo »

arturx hat geschrieben:1.Müsste man nicht das Verhalten des tImage als Bug melden ?


Könnte man machen, v.A. weil es auf Linux GTK2 und Qt wie erwartet gelb wird.

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: Jpg Canvas pen.color

Beitrag von Heinrich Wolf »

arturx hat geschrieben:1.Müsste man nicht das Verhalten des tImage als Bug melden ?

Ja, das finde ich gerechtfertigt.
arturx hat geschrieben:2.Wie kommt man auf jpegimage (ich kannte es vorher nicht) und warum gibt es das nicht als Komponente ?
(Ist für mich jetzt nicht mehr so kritisch, da ich nun die Kombi image/jpegimage kenne).

Ich kenne Delphi länger als Lazarus. Dort ist für diesen Fall ein TJpegImage Pflicht. TJpegImage ist in Delphi auch nur eine Klasse, keine Komponente. Lazarus versucht hier kompatibel zu Delphi zu bleiben. Button1Click zeigt in Delphi bei einem *.jpg gar nichts an, weil Image1.Picture.LoadFromFile('firmenlogo.jpg') nicht funktioniert. Button2Click und Button3Click zeigen bei Delphi für *.jpg dasselbe wie bei *.bmp an.

arturx
Beiträge: 140
Registriert: Fr 21. Nov 2008, 11:29
OS, Lazarus, FPC: Winux (L 1.0.6.xy FPC 2.6.z)
CPU-Target: 32/64Bit

Re: Jpg Canvas pen.color

Beitrag von arturx »

Das "jpg-Problem" ist ursprünglich aufgetreten,
weil ich in einem Lazreport nach Laden des jpg-Bildes in dieses Bild malen wollte :

Code: Alles auswählen

procedure Tform.frReport1EnterRect(Memo: TStringList; View: TfrView);
     begin      tfrpictureview(view).Picture.Bitmap.LoadFromFile('xyz.jpg');
                   .....
    end;

Das gleiche Verhalten trat in einem image auf und ließ sich so klarer im Forum darstellen.
Es scheint also ein allgemeines Problem des picture/bitmap... loadfromfile zu sein( zumindest unter windows).
Falls es durch einen Betriebssystemsaufruf verursacht sein sollte, ließe es sich leicht umgehen durch Heiners workaround:

Code: Alles auswählen

...loadfromfile(filename : string); override;
begin If (Uppercase(extractfileext(filename))='.JPG') then
             begin ... workaround....
             end
           else inherited loadfromfile(filename);
end;


Vielen Dank für den sehr hilfreichen Informationsaustausch !!

Antworten