Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TJPEGimage (https://www.delphipraxis.net/142331-tjpegimage.html)

Detrox 26. Okt 2009 12:34


TJPEGimage
 
Hallo,

Ich habe einen tollen Code gefunden.

Delphi-Quellcode:
var
  myClient: TidHTTP;
  myMemoryStream: TMemoryStream;
  myJPEG: TJPEGimage;
begin
  myClient := TidHTTP.Create(Self);
  myMemoryStream := TMemoryStream.Create;
  myJPEG := TJPEGImage.Create;

  try
    myClient.Get('http://meinbild.de/bild.jpg', myMemoryStream);
    myMemoryStream.Position := 0;
    myJPEG.LoadFromStream(myMemoryStream);
  finally
    myJPEG.Free;
    myMemoryStream.Free;
    myClient.Free;
  end;
end;
Dazu eine Frage:

Das Bild kann jpg/gif oder png sein

wenn das Bild kein jpg ist hängt sich das Programm auf, wie kann ich dies erweitern?

freue mich über Hilfe

LG
Detrox

himitsu 26. Okt 2009 12:43

Re: TJPEGimage
 
TJPEGImage ... vielleicht fällt dir was auf :?:

TGifImage ... TBitMap ...


nimm TGraphic oder TPicture und binde die Units für GIF und JPEG mit ein, diese sollten ihre Grafikformate dann automatisch bei TGrafic/TPicture registrieren und über dieses genutzt werden können.

MarcoWarm 26. Okt 2009 12:44

Re: TJPEGimage
 
Hi Detrox,

der einfachste weg wäre es, die Daten als Datei mit korrekter File-Extension zu speichern und mittels TPicture.LoadFromFile zu laden.

ansonsten musst du selbst die URL parsen und auf Basis der Endung die korrekte TGraphicClass bestimmen (aber da ist TPicture sauberer)

Gruß
Marco

Tyrael Y. 26. Okt 2009 12:51

Re: TJPEGimage
 
File Extension?
Die sagt mal gar nichts aus.

Die einzig richtige Prüfung einer Datei, ist die Prüfung des Headers.
Auf wikipedia sind für alle gängigen Grafikformate die Header aufgeführt.

Schau dort nach dem Header und prüfe deine Grafiken damit.

Bei dem IconLev aus der Signatur mache ich es genauso.
Dateiendung ist schnuzpiepegal.

Detrox 26. Okt 2009 12:55

Re: TJPEGimage
 
Hi
Tyrael Y.

Sry verstehe nicht wirklich was du meinst bin noch Anfänger :roll:

MarcoWarm 26. Okt 2009 13:00

Re: TJPEGimage
 
Zitat:

Zitat von Tyrael Y.
File Extension?
Die sagt mal gar nichts aus.

Ich nahm nur auf existierende Funktionalität von Delphi bezug. TPicture macht es genau über registrierte File Extenstions. Das das nicht der Weisheit letzter Schluss ist, ist mir klar.

Gruß
Marco

Detrox 26. Okt 2009 13:10

Re: TJPEGimage
 
Also die Bilder ändern sich auch deshalb ist es mir lieber sie jedes mal einzustreamen, nur hab ich keine AHnung wie ich rausbekommen soll um was für ein Dateiformat es sich handelt. :roll:

himitsu 26. Okt 2009 13:13

Re: TJPEGimage
 
ExtractFileExt

ansonsten ist es egal, wenn du TPicture nimmst, da dieses selber entscheidet, welches Format nötig ist.

Tyrael Y. 26. Okt 2009 13:16

Re: TJPEGimage
 
Wollte dich nicht angreifen Marco, möchte nur darauf aufmerksam machen, daß eine Prüfung auf die Dateiendung nicht wirklich gut ist, da es keine Aussage hat.

@Detox
Jede Grafikdatei hat seinem Typ entsprechend einen Teil am Anfang die ihn identifizieren.
Diesen Teil nennt man Header. Aufgrund der ersten paar Bytes kann festgestellt werden, ob es sich um einen bestimmten Typen handelt.

Nimm einfach mal eine Grafikdatei und öffne es in einem beliebigen Hex-Editor.
Wenn du nun verschiedene Grafikdateien des selben Typen im Hex-Editor öffnest und dir die ersten paar Bytes anschaust, wirst du merken, daß diese gleich sind.

Ich hab eben mal einen JPEG geöffnet und dort sieht der Anfang so aus.

Code:
FF D8 FF E0 00 10 4A 46 49 46
Sieht so aus, als wäre dies der "magische Teil".
Du liest also ersten 10 Bytes aus wenn du auf JPEG prüfen möchtest und vergleichst diese mit diesen Bytes.

Detrox 26. Okt 2009 14:02

Re: TJPEGimage
 
Ich hab jetzt echt alles probiert ich bekomms nicht hin:

Bekannt ist:

Die Url:
zB

www.google.de/bild1.jpg
oder
www.google.de/bild1.gif

usw

Ich möchte das Bild nicht lokal abspeichern denn es kann sich auch ändern und soll immer aktuell gestreamt werden.

:(

himitsu 26. Okt 2009 14:08

Re: TJPEGimage
 
Wenn du echt alle probiert hättest, dann würde es jetzt gehn!

Was hast du denn aktuell für Code?

Detrox 26. Okt 2009 14:14

Re: TJPEGimage
 
aktuell immer noch diesen
Delphi-Quellcode:
var
  myClient: TidHTTP;
  myMemoryStream: TMemoryStream;
  myJPEG: TJPEGimage;
begin
  myClient := TidHTTP.Create(Self);
  myMemoryStream := TMemoryStream.Create;
  myJPEG := TJPEGImage.Create;

  try
    myClient.Get('http://meinbild.de/bild.jpg', myMemoryStream);
    myMemoryStream.Position := 0;
    myJPEG.LoadFromStream(myMemoryStream);
  finally
    myJPEG.Free;
    myMemoryStream.Free;
    myClient.Free;
  end;
end;
habe halt versucht aus dem JPEg EIn TImage zu machen aber das funktioniert halt nicht un in der Bilddatei direkt lesen ist glaube ein wenig zu hoch für mich. Sry das ich mich so blöd anstelle .

Detrox 27. Okt 2009 01:19

Re: TJPEGimage
 
Zitat:

Zitat von himitsu
TJPEGImage ... vielleicht fällt dir was auf :?:

TGifImage ... TBitMap ...


nimm TGraphic oder TPicture und binde die Units für GIF und JPEG mit ein, diese sollten ihre Grafikformate dann automatisch bei TGrafic/TPicture registrieren und über dieses genutzt werden können.

Hi, also bei TPicture gibt es aber kein Loadfromstream :|

Klaus01 27. Okt 2009 07:21

Re: TJPEGimage
 
Zitat:

Zitat von Detrox
Hi, also bei TPicture gibt es aber kein Loadfromstream :|

Guten Morgen,

TGraphic aber schon.

Grüße
Klaus

Detrox 27. Okt 2009 07:26

Re: TJPEGimage
 
Ok, werd ich mal ausprobieren, dann muss ich nur noch die png/gif Unterstützung runter laden von Torry ?

turboPASCAL 27. Okt 2009 07:44

Re: TJPEGimage
 
Zitat:

Zitat von Klaus01
TGraphic aber schon.

Das wird aber dann krachen. ;)

Detrox 27. Okt 2009 07:45

Re: TJPEGimage
 
turboPascal was meinst du damit?

LG
Detrox

Tyrael Y. 27. Okt 2009 08:10

Re: TJPEGimage
 
Mach ein TImage auf eine Form und einen Button.
Dann folgenden Code testen.
Sollte finktionieren.

Und danach bitte jede Zeile genau angucken und versuchen zu verstehen.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
 GetImage();
end;

procedure TForm1.GetImage();
var
  myClient: TidHTTP;
  myMemoryStream: TMemoryStream;
  myJPEG: TJPEGimage;
begin
  myClient := TidHTTP.Create(Self);
  myMemoryStream := TMemoryStream.Create;
  myJPEG := TJPEGImage.Create;

  try
    myClient.Get('http://www.delphipraxis.net/images/pages/impressum/daniel_wolf.jpg', myMemoryStream);
    myMemoryStream.Position := 0;

    Image1.Picture.Graphic := myJPEG;
    Image1.Picture.Graphic.LoadFromStream(myMemoryStream);


  finally
    myJPEG.Free;
    myMemoryStream.Free;
    myClient.Free;
  end;
end;

turboPASCAL 27. Okt 2009 08:17

Re: TJPEGimage
 
Delphi-Quellcode:
Picture.Graphic.LoadFromStream(..)
wird einen Fehler verursachen, das hat mit dem Aufbau von TGraphic zu tun.


Wenn du Bilder vom Web laden willst kennst du doch deren Endung, also .jpg. bmp. .gif etc.
danach kannst du entscheiden wie und was du laden möchtest.

zB.:

Delphi-Quellcode:
uses ..., IdHTTP, PngImage, Jpeg, GifImage;

// ...

function DownloadImageByName(const URL : string; Image: TImage): Boolean;
var
  idHttp: TIdHTTP;
  ImgStream: TMemoryStream;
  FExt: String;
begin
  Result := False;

  if ASSIGNED(Image) then
  begin
    ImgStream := TMemoryStream.Create;
    try
      idHttp := TIdHTTP.Create(nil);
      try
        idHttp.Get(URL, ImgStream);
      finally
        idHttp.Free;
      end;

      if ImgStream.Size > 0 then
      begin
        FExt := ExtractFileExt(URL);
        ImgStream.Position := 0;

        if AnsiLowerCase(FExt) = '.bmp' then
        begin
          Image.Picture.Assign(TBitmap(ImgStream));
          Result := True;
        end else
        if (AnsiLowerCase(FExt) = '.jpg') or( AnsiLowerCase(FExt) = '.jpeg') then
        begin
          Image.Picture.Assign(TJpegImage(ImgStream));
          Result := True;
        end else
        if AnsiLowerCase(FExt) = '.png' then
        begin
          Image.Picture.Assign(TPNGObject(ImgStream));
          Result := True;
        end else
        if AnsiLowerCase(FExt) = '.gif' then
        begin
          Image.Picture.Assign(TGifImage(ImgStream));
          Result := True;
        end else
          ShowMessage('Nicht unterstütztes Bildformat: ' + FExt);
      end else
       ShowMessage('Kein Daten geleden !');

    finally
      ImgStream.Free;
    end;

  end else
    ShowMessage('Kein gültiges Image angegeben !');
end;
Das ist frei nach Nase getippt, keine Funktionsgarantie!

Tyrael Y. 27. Okt 2009 08:20

Re: TJPEGimage
 
@turbopascal: es funktioniert aber ;), probier es aus...

Detrox 27. Okt 2009 08:30

Re: TJPEGimage
 
Tyrael Y.


Das hatte ich ja auch schon funktioniert auch Super, aber wie gesagt nur jpg ich weis nicht welches Format das Bild hat es kann 3 Formate haben:

JPG/PNG/GIF

Ich probiere jetzt mal das andere aus.

LG

Tyrael Y. 27. Okt 2009 08:34

Re: TJPEGimage
 
Detrox mal bitte nachdenken.
Guck dir mal den Code von turboPASCAL an. Ich hab dsa Gefühl du hast es nicht gemacht.

Delphi-Quellcode:
...
        if AnsiLowerCase(FExt) = '.bmp' then
        begin
          Image.Picture.Assign(TBitmap(ImgStream));
          Result := True;
        end else
...
Dieser ganze Teil prüft auf den Typ und castet den Stream entsprechend.
Also bitte mal Posts, die dir auf den ersten Blick kompliziert erscheinen nicht übergehen.

Das Problem ist an sich schon gelöst.

DeddyH 27. Okt 2009 08:37

Re: TJPEGimage
 
Du widersprichst Dir selbst, der Code überprüft nicht den Typ, sondern die Endung ;). Aber gehen wir einfach davon aus, dass die schon stimmen wird, sonst verwirren wir den TE noch mehr, und verbessern kann man ja später immer noch.

Detrox 27. Okt 2009 08:42

Re: TJPEGimage
 
Hi turboPASCAL


Super Code, nur sieht meine Ermittelte Bildurl in etwa so aus:


http://www.google.de/tomate.gif

deine Function erwartet einmal die Variable URL & TImage

wenn ich das richtig verstehe ist TImage der Bildname mit Dateiendung?

Tyrael Y. 27. Okt 2009 08:45

Re: TJPEGimage
 
Ich wollte nur dem TE darauf aufmersam machen, daß es schon eine quasi Prüfung gibt.

Wenn es erst mal so läuft bei ihm kann er eine Funktion
Delphi-Quellcode:
type TPicTypes =(ptUnknown, ptBitmap, ptJPEG, ptPNG,....)
...
function GetTpyeOfImage(Stream: TMemoryStream): TPicTypes;
machen.
...und dann in einem Case das ganze abhändeln.

Lass ihn aber erst einmal das bisher verstehen. ;)

DeddyH 27. Okt 2009 08:50

Re: TJPEGimage
 
Meine Rede ;)

@TE: Du übergibst die URL und das TImage, in dem das Bild angezeigt werden soll, an die Funktion, das sollte doch nicht allzu schwer sein.
Delphi-Quellcode:
if not DownloadImageByName('http://www.irgendwo.de/bild.gif', ImageDasDieGrafikAnzeigenSoll) then
  //Fehlermeldung

Detrox 27. Okt 2009 08:52

Re: TJPEGimage
 
Tyrael Y.


Nach deinem Code, soll Delphi reagieren wenn die Dateiendung Beispielsweise ".gif" ist.

Aber wie reagieren, so bringe ich Delphi immer noch nicht dazu Gifs zu akzeptieren und anzuzeigen
oder muss ich da wieder alles komplett neu schreiben wie zB:

myJPEG := TGifImage.Create;

?

MarcoWarm 27. Okt 2009 08:53

Re: TJPEGimage
 
Hallo miteinander,

um die Massen noch ein wenig zu verwirren :twisted:

sagt euch mal gedanklich von dem GDI-Kram los. Also keine TJpegImage, TBitmap usw.

Macht es einfach per GDI+. Mir ist gestern aufgefallen, daß Windows (Vista) kein Problem damit hat, wenn eine GIF-Datei eine PNG-Endung hat.
Also ist folgender Code rausgekommen:

Delphi-Quellcode:
procedure TForm7.Button1Click(Sender: TObject);
var
  Graphics  : IGPGraphics;
  Bitmap    : IGPBitmap;
  FileStream : TFileStream;
  StreamAdap : TStreamAdapter;
begin
  FileStream:=TFileStream.Create('C:\Users\MaWarm\Desktop\tools.irgendeindateiformat', fmOpenRead);
  StreamAdap:=TStreamAdapter.Create(FileStream, soOwned);

  Graphics:=TGPGraphics.Create(Self.Canvas);
  Bitmap:=TGPBitmap.Create(StreamAdap);

  Graphics.DrawImage(Bitmap,MakePoint(0,0));
end;
Alles was ihr sonst noch so braucht, ist IGDIPlus.

Statt Filestream kann hier natürlich auch jeder andere Stream genutzt werden.

Viel Spaß
Marco

Tyrael Y. 27. Okt 2009 09:51

Re: TJPEGimage
 
Zitat:

Zitat von Detrox
Tyrael Y.


Nach deinem Code, soll Delphi reagieren wenn die Dateiendung Beispielsweise ".gif" ist.

Aber wie reagieren, so bringe ich Delphi immer noch nicht dazu Gifs zu akzeptieren und anzuzeigen
oder muss ich da wieder alles komplett neu schreiben wie zB:


Zitat:

Zitat von turboPASCAL

Delphi-Quellcode:
uses ..., IdHTTP, PngImage, Jpeg, GifImage;
// ...
          Image.Picture.Assign(TBitmap(ImgStream));
// ...
          Image.Picture.Assign(TJpegImage(ImgStream));
// ...
          Image.Picture.Assign(TPNGObject(ImgStream));
// ...
          Image.Picture.Assign(TGifImage(ImgStream));

Bei diesen Teilen des SourceCodes wird der Stream nach einer Prüfung, so behandelt wie der entsprechende Typ.
Genau das musst du dann machen.

Edit:
Der SourceCode von turboPascal ist doch ok, probier es doch mal.

Detrox 27. Okt 2009 10:01

Re: TJPEGimage
 
Ja der Quellcode von Turbopascal geht auch, hab mir mal bei jedem Bildformat Showmessage(Bildformat) anzeigen lassen erkennt alles richtig, nur zeigt das Bild noch nicht in meinem Image an.

da wos angezeigt werden soll: image1

aufgerufen habe ich die function so:

DownloadImageByName(avatarurl, Image1);

Wie gesagt wird nix angezeigt in der Imagebox

himitsu 27. Okt 2009 10:05

Re: TJPEGimage
 
@Turbo:
Delphi-Quellcode:
Image.Picture.Assign(TBitmap(ImgStream));
dieses kann nichts bewirken, weil TBitmap intern niemand mehr kennt, da bei diesem Assign intern nur noch TPersitent (Typ des Parameters) und der innere Type des Objekts bekannt ist ... harte Casts ändern daran nichts.
Und da alle deine Casts nach Innen gleich aussehn, bringt diese ganze Fallunterscheidung nicht wirklich etwas. :angel2:

Detrox 27. Okt 2009 10:07

Re: TJPEGimage
 
Jetzt hab ich 1000 Vorschläge und alle wiedersprechen sich ich weis garnix mehr :lol:

Tyrael Y. 27. Okt 2009 10:31

Re: TJPEGimage
 
Probier mal turboPASCAL´s Code in der Art zu ändern...
Delphi-Quellcode:
else
        if (AnsiLowerCase(FExt) = '.jpg') or( AnsiLowerCase(FExt) = '.jpeg') then
        begin
          Image.Picture.Graphic := TJpegImage.Create;
          Image.Picture.Graphic.LoadFromStream(ImgStream);
          Result := True;
        end else
...das Ganze natürlich für alle Typen.

Detrox 27. Okt 2009 10:45

Re: TJPEGimage
 
Dankeschön funktioniert :)

Wenn nix davon eintritt kommt ja eine Fehlermeldung nicht nur die
if else - keine daten geladen, sondern auch eine vom Programm direkt.

möchte die fehlermeldung abfangen, wenn der Link fehlerhaft ist kann er das ja nicht ins bild laden.
Stattdessen möchte ich eine andere aktion ausführen..

LG


PS: erstmal vielen Dank jetzt klappt das schonmal :)

DeddyH 27. Okt 2009 10:50

Re: TJPEGimage
 
Ich bin zwar kein Indy-Experte, aber vielleicht kannst Du einmal idHTTP.ResponseCode auf 200 prüfen.

Detrox 27. Okt 2009 11:25

Re: TJPEGimage
 
Hm gute Idee.

Folgender Code:

Delphi-Quellcode:
idHttp.Get(URL, ImgStream);
if idhttp.ResponseCode = 200 then
sobald idhttp die Url hat kommt schon der Fehler

wenn ich es so mache:

Delphi-Quellcode:
if idhttp.ResponseCode = 200 then
idHttp.Get(URL, ImgStream);
bringt es ja auch nichts weil idhttp denkt es sei alles gut (weil keine Url zugewiesen)

Detrox 27. Okt 2009 12:23

Re: TJPEGimage
 
OK ich habs Thread kann geschlossen werden...


Nochmal danke für die Hilfe :)

Tyrael Y. 27. Okt 2009 12:28

Re: TJPEGimage
 
Jetzt solltest du dich daraum kümmern, den geholten Stream zu prüfen.
Wie ich es dir schon angedeutet habe, durch Prüfung des Headers.

Statt also anhand der Dateiendung den Typ zu bestimmen, solltest du das anhand des Headers prüfen.
Dann ist der Code auch ok, ansonsten ist der Code auch anzuzweifeln, da ich dir einfach irgendwo ins Netz
eine Datei mit der Ändung .jpg hinlege und es eigentlich ein Word-Dokument ist.

Detrox 27. Okt 2009 13:11

Re: TJPEGimage
 
Ist richtig, aber in meinem spezifischen Fall wird dies nicht eintreten. Trotzdem werd ich mir das mal zu Gemüte führen :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz