Entwickler-Ecke

Multimedia / Grafik - Jpg während laufzeit aus Datei lesen


GlaN - Fr 03.06.05 18:59
Titel: Jpg während laufzeit aus Datei lesen
hi


ich hab ein kleines Problem und zwar habe ich einige images die ursprünglich nur Bmp's zeigen sollen, doch da mir das Programm zu groß wurde wollte ich alles auf JPG umstellen. Leider hab ich mit der Suchfunktion nichts gefunden das mein Problem löst.

jetzt mein Problem:

wenn ich das Bild ändern möchte geht das nicht
Fehlermeldung: 'Can only modify an image if it contains a bitmap'
ich hab in den uses jpeg hingeschrieben.


Delphi-Quelltext
1:
2:
3:
4:
if strtoint(alist.Strings[14])>0 then
  p1.Picture.LoadFromFile(pod)
else
  p1.Canvas.Rectangle(0,0,100,90);


ich hoffe es kann mir jemand helfen

währe es auch möglich, dass das Problem dadurch besteht das ich das Programm mit Delphi 6 begonnen habe und jetzt das 2005er verwende?

mfg GlaN


DarkHunter - Fr 03.06.05 19:31

Du musst unter USES "JPEG" einbinden, dann sollte das gehen.


GlaN - Fr 03.06.05 20:00

Zitat:

ich hab in den uses jpeg hingeschrieben.

:roll:
hilft nichts


DarkHunter - Fr 03.06.05 20:21

user profile iconGlaN hat folgendes geschrieben:
Zitat:

ich hab in den uses jpeg hingeschrieben.

:roll:
hilft nichts


wer lesen kann ist klar im vorteil :D

Also von der Konvertierung von D6 nach D2005 kann es eigentlich nicht kommen.

Was ist die variable pod?
und zweitens (pl ist ein TImage oder)

Delphi-Quelltext
1:
pl.picture.canvas.Rectangle(0,0,100,90);                    


GlaN - Fr 03.06.05 21:32

pod ist der Pfad der Datei

p1 ist ein Timage

und picture.canvas gibt es nicht!!!!


DarkHunter - Fr 03.06.05 21:48

*kratz sich am Kopf*
ab ich gerade ein Langzeit Blackout? :P

Ich weiß jetzt was das Problem ist.
In das Timage hast du ein JPG geladen
Canvas kann aber nur arbeiten wenn du ein bitmap im Timage hat

wie sich das lösen läßt weiß ich nicht


GlaN - Sa 04.06.05 00:42

das mit dem Canvas ist auch nur eine Notlösung.

ist es möglich das Bild zu entfernen, so das der Hintergrund wieder sichtbar ist?
jetzt übermale ich einfach das ganze Bild mit der Hitergrundfarbe :oops:


DarkHunter - Sa 04.06.05 12:23

für das übermalen brauchs du wieder canvas.
am einfachsten wäre es glaube ich das Timage einach unsichtbar zu machen und wenn ein neues bild geladen wird wieder sichtbar


GlaN - Sa 04.06.05 14:20

Danke das funktioniert

ein Problem hab ich jedoch noch


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TForm1.techgridMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var s : integer;
    hx, hy : integer;
begin
  hx := 0;
  hy := (y div 90)*90;
  techgrid.Canvas.Brush.Style := bsclear;
  s := y div 90+1;
  aslist.LoadFromFile(path+techlist.Strings[s]);
  atech := y div 90+2;
  techgrid.canvas.Pen.color := clblack;
  techgrid.Canvas.Rectangle(rectold);
  techgrid.canvas.pen.color := clyellow;
  techgrid.Canvas.rectangle(hx,hy,hx+100,hy+90);
  rectold.Right := hx;
  rectold.Top := hy;
  rectold.Left := hx+100;
  rectold.Bottom := hy+90;;
end;

techgrind ist wieder ein Timage


hier wird wenn ich einen bestimmten bereich des Bildes ancklicke dieser mit einem Gelben Rahmen eingeschlossen.

gibt es da eine andere Lösung
und muss ich bei den Bilderb bei Bmp bleiben

mfg GlaN


root_at_localhost - Sa 04.06.05 14:50

Lade die JPEG, kopiere das Bild in eine TBitmap, verändere es. Bei bedarf kopierst du es zurück in ein JPEG, komprimierst es und speichers es wieder.


GlaN - Sa 04.06.05 15:27

aber wie?

das funktioniert nicht:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var    oPicture: TJPEGImage;
       oBitmap: TBitmap;

begin
  techlist.LoadFromFile(path+'Angriff.txt');
  oPicture := TJPEGImage.Create;
  oPicture.LoadFromFile(path+techlist.Strings[0]);
  oBitmap := TBitmap.Create;
  oBitmap.Assign(oPicture);
  techgrid.Picture.Assign(oBitmap);
  list := 1;
end;


root_at_localhost - Sa 04.06.05 17:36


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.Button1Click(Sender: TObject);
var
  jpeg : TJPEGImage;
begin
  jpeg := TJPEGImage.Create;
  jpeg.LoadFromFile('Test.jpg');
  Image1.Picture.Bitmap.Assign(jpeg);
  Image1.Picture.Bitmap.Canvas.Rectangle(115050);
  jpeg.Free;
end;

funktioniert bei mir ohne Probleme, Image1 ist ein TImage auf dem Formular.


GlaN - Sa 04.06.05 21:24

nein geht nicht: "JPEG error #53"

noch eine Frage kann man bei einem Image eine Farbe des Bildes unsichtbar machen?
gif Bilder gehen ja nicht.


DarkHunter - Sa 04.06.05 21:49

du musst transparency auf true setzen, dann wird die farbe durchsichtig geschaltet, die der untere linke pixel hat.
alternativ über

Delphi-Quelltext
1:
2:
timage.transparencycolor := TColor;
timage.tranparent := true;

die farbe setzen


GlaN - Sa 04.06.05 22:09

hm wenn ich die transparencycolorauf zb clBlue setze ist das ganze bild nicht mehr zu sehen :?

[Edit] auch wenn ich nur image.picture.Bitmap.Transparent := true;
hinschreibe sieht man nichts mehr.
die Farbe im linken unteren Eck ist die die unsichtbar werden soll
[/Edit]


GlaN - So 05.06.05 13:24

so

ich hab mich noch ein bischen beschäftigt
und heraugefunden das es das nicht gibt!

timage.transparencycolor := TColor;

das gibt es:

timage.picture.bitmap.TransparentColor := TColor;

bringt aber nichts, da ich kein bitmap verwende. Auch wenn ich eines verwende hilft es nichts.

kann es sein das ich da eine eigene Componente brauche?
hab auch in der Hilfe von Delphi nichts passendes gefunden

mfg GlaN


root_at_localhost - So 05.06.05 17:03

Wie gesagt, ich habe den JPEG-Code getestet und er läuft. Welche Version von Delphi? Kann ich das Prog mal komplett einsehen, vieleicht kann ich dir dann helfen.


GlaN - So 05.06.05 17:48



GTA-Place - So 05.06.05 18:16

user profile iconGlaN hat folgendes geschrieben:
ist es möglich das Bild zu entfernen, so das der Hintergrund wieder sichtbar ist?
jetzt übermale ich einfach das ganze Bild mit der Hitergrundfarbe :oops:



Delphi-Quelltext
1:
Image1.Picture := nil;                    


Meinst du das?


GlaN - So 05.06.05 18:35

Danke aber das Problem ist schon gehoben

jetzt muss ich nur noch ein Trnsparentes bild rein bringen
und ein paar wenige bilder auf jpg umstellen