![]() |
TJPEGimage
Hallo,
Ich habe einen tollen Code gefunden.
Delphi-Quellcode:
Dazu eine Frage:
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; 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 |
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. |
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 |
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. |
Re: TJPEGimage
Hi
Tyrael Y. Sry verstehe nicht wirklich was du meinst bin noch Anfänger :roll: |
Re: TJPEGimage
Zitat:
Gruß Marco |
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:
|
Re: TJPEGimage
ExtractFileExt
ansonsten ist es egal, wenn du TPicture nimmst, da dieses selber entscheidet, welches Format nötig ist. |
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:
Sieht so aus, als wäre dies der "magische Teil".
FF D8 FF E0 00 10 4A 46 49 46
Du liest also ersten 10 Bytes aus wenn du auf JPEG prüfen möchtest und vergleichst diese mit diesen Bytes. |
Re: TJPEGimage
Ich hab jetzt echt alles probiert ich bekomms nicht hin:
Bekannt ist: Die Url: zB ![]() oder ![]() usw Ich möchte das Bild nicht lokal abspeichern denn es kann sich auch ändern und soll immer aktuell gestreamt werden. :( |
Re: TJPEGimage
Wenn du echt alle probiert hättest, dann würde es jetzt gehn!
Was hast du denn aktuell für Code? |
Re: TJPEGimage
aktuell immer noch diesen
Delphi-Quellcode:
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 .
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; |
Re: TJPEGimage
Zitat:
|
Re: TJPEGimage
Zitat:
TGraphic aber schon. Grüße Klaus |
Re: TJPEGimage
Ok, werd ich mal ausprobieren, dann muss ich nur noch die png/gif Unterstützung runter laden von Torry ?
|
Re: TJPEGimage
Zitat:
|
Re: TJPEGimage
turboPascal was meinst du damit?
LG Detrox |
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; |
Re: TJPEGimage
Delphi-Quellcode:
wird einen Fehler verursachen, das hat mit dem Aufbau von TGraphic zu tun.
Picture.Graphic.LoadFromStream(..)
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:
Das ist frei nach Nase getippt, keine Funktionsgarantie!
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; |
Re: TJPEGimage
@turbopascal: es funktioniert aber ;), probier es aus...
|
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 |
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:
Dieser ganze Teil prüft auf den Typ und castet den Stream entsprechend.
...
if AnsiLowerCase(FExt) = '.bmp' then begin Image.Picture.Assign(TBitmap(ImgStream)); Result := True; end else ... Also bitte mal Posts, die dir auf den ersten Blick kompliziert erscheinen nicht übergehen. Das Problem ist an sich schon gelöst. |
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.
|
Re: TJPEGimage
Hi turboPASCAL
Super Code, nur sieht meine Ermittelte Bildurl in etwa so aus: ![]() deine Function erwartet einmal die Variable URL & TImage wenn ich das richtig verstehe ist TImage der Bildname mit Dateiendung? |
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:
machen.
type TPicTypes =(ptUnknown, ptBitmap, ptJPEG, ptPNG,....)
... function GetTpyeOfImage(Stream: TMemoryStream): TPicTypes; ...und dann in einem Case das ganze abhändeln. Lass ihn aber erst einmal das bisher verstehen. ;) |
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 |
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; ? |
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:
Alles was ihr sonst noch so braucht, ist
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; ![]() Statt Filestream kann hier natürlich auch jeder andere Stream genutzt werden. Viel Spaß Marco |
Re: TJPEGimage
Zitat:
Zitat:
Genau das musst du dann machen. Edit: Der SourceCode von turboPascal ist doch ok, probier es doch mal. |
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 |
Re: TJPEGimage
@Turbo:
Delphi-Quellcode:
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.
Image.Picture.Assign(TBitmap(ImgStream));
Und da alle deine Casts nach Innen gleich aussehn, bringt diese ganze Fallunterscheidung nicht wirklich etwas. :angel2: |
Re: TJPEGimage
Jetzt hab ich 1000 Vorschläge und alle wiedersprechen sich ich weis garnix mehr :lol:
|
Re: TJPEGimage
Probier mal turboPASCAL´s Code in der Art zu ändern...
Delphi-Quellcode:
...das Ganze natürlich für alle Typen.
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 |
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 :) |
Re: TJPEGimage
Ich bin zwar kein Indy-Experte, aber vielleicht kannst Du einmal idHTTP.ResponseCode auf 200 prüfen.
|
Re: TJPEGimage
Hm gute Idee.
Folgender Code:
Delphi-Quellcode:
sobald idhttp die Url hat kommt schon der Fehler
idHttp.Get(URL, ImgStream);
if idhttp.ResponseCode = 200 then wenn ich es so mache:
Delphi-Quellcode:
bringt es ja auch nichts weil idhttp denkt es sei alles gut (weil keine Url zugewiesen)
if idhttp.ResponseCode = 200 then
idHttp.Get(URL, ImgStream); |
Re: TJPEGimage
OK ich habs Thread kann geschlossen werden...
Nochmal danke für die Hilfe :) |
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. |
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