Entwickler-Ecke
Multimedia / Grafik - TGraphic physisch verkleinern
LittleBen - Fr 12.09.14 10:57
Titel: TGraphic physisch verkleinern
Hallo zusammen,
mein neustes Problem sieht so aus, dass ich ein TGraphic verkleinern muss. Also so, dass der Speicherbedarf kleiner wird.
Das Hinderniss hierbei ist, dass das TGraphic ein TGraphic
bleiben muss. Mit ImageEn habe ich zwar schon geschafft, das Bild zu verkleinern, aber danach bekomme ich zwangsläufig ein TBitmap (nicht transparent) zurück.
Die Bilder, die ich verkleinern möchte, werden aus dem Internet heruntergeladen, können also jedes beliebige Format haben.
Hier ist mein bisheriger Code zum runterladen des Bildes, was dann anschließend als TGraphic zurück geliefert wird:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58:
| function GetGraphicClass(const ext: String): TGraphicClass; begin if ext='.bmp' then Result := TBitmap else if ext='.ico' then Result := TIcon else if (ext='.wmf') or (ext='.emf') then Result := TMetafile else if (ext='.jpg') or (ext='.jpeg') then Result := TJpegImage else if (ext='.tif') or (ext='.tiff') then Result := TWICImage else if ext='.png' then Result := TPngImage else if ext='.gif' then Result := TGifImage else Result := nil; end;
function DownloadImage(const URL: String): TGraphic; var GrClass: TGraphicClass; Stream: TMemoryStream; IdHTTP: TIdHTTP; begin Result := nil; if Copy(LowerCase(URL), 1, 7)<>'http://' then begin Application.MessageBox('"http://" is required', 'Error'); exit; end; GrClass := GetGraphicClass(LowerCase(ExtractFileExt(URL))); if GrClass=nil then begin Application.MessageBox('Unknown picture format', 'Error'); exit; end; Stream := TMemoryStream.Create; try IdHTTP:= TIdHTTP.Create(nil); try IdHTTP.Get(URL, Stream); except Application.MessageBox('Cannot download the image', 'Error'); FreeAndNil(Stream); end; IdHTTP.Free; if Stream<>nil then try Result := GrClass.Create; Stream.Position := 0; Result.LoadFromStream(Stream); except Application.MessageBox('Invalid image', 'Error'); FreeAndNil(Result); end; finally Stream.Free; end; end; |
Wäre toll, wenn mir hierbei jemand helfen könnte.
Viele Grüße
Benny
Blup - Mo 15.09.14 10:14
LittleBen hat folgendes geschrieben : |
Hallo zusammen,
mein neustes Problem sieht so aus, dass ich ein TGraphic verkleinern muss. Also so, dass der Speicherbedarf kleiner wird.
|
Also sollen Breite und Höhe der Grafik unverändert bleiben?
Auf jeden Fall leidet die Qualität.
LittleBen hat folgendes geschrieben : |
Das Hinderniss hierbei ist, dass das TGraphic ein TGraphic bleiben muss. Mit ImageEn habe ich zwar schon geschafft, das Bild zu verkleinern, aber danach bekomme ich zwangsläufig ein TBitmap (nicht transparent) zurück.
|
TBitmap ist auch ein Nachkomme von TGraphic.
Deine Bedingung ist also, die Transparenz soll erhalten bleibt.
LittleBen hat folgendes geschrieben : |
Die Bilder, die ich verkleinern möchte, werden aus dem Internet heruntergeladen, können also jedes beliebige Format haben.
|
Nach deinem Quelltext können das nur ganz bestimmte Formate sein, die dein Programm unterstützt.
LittleBen hat folgendes geschrieben : |
Hier ist mein bisheriger Code zum runterladen des Bildes, was dann anschließend als TGraphic zurück geliefert wird:
|
Eigentlich nicht relevant, da für das eigentliche Problem noch keine Zeile Code existiert.
Ich würde allerdings bei der Exception-Behandlung anders vorgehen.
Es gibt eine zentrale Stelle (Application.OnException) die alle Fehlermeldungen verarbeitet.
Statt die eigentliche Meldung der Exception zu ersetzen, würde ich die Fehlermeldung nur ergänzen.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| except on E: Exception do begin FreeAndNil(Result); E.Message := 'Invalid image: ' + E.Message; raise; end; end; |
Zum eigentlichen Problem:
Such dir ein Grafikformat/Bibliothek das Skalieren mit Transparenz unterstützt.
z.B. Graphics32
Dann musst du dich nur noch um die Konvertierung in dieses Format kümmern.
Wahrscheinlich gibt es dafür auch schon fertige Funktionen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!