Autor Beitrag
LittleBen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 258
Erhaltene Danke: 4

Win 7, Mac OS
Delphi 7
BeitragVerfasst: Fr 12.09.14 09:57 
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:
ausblenden volle Höhe 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), 17)<>'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
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Fr 12.09.14 12:26 
Hier ein Ansatz: www.detlef-heibing.d...ional-skalieren.html. Quelle und Ziel müssen schon vorher instanziert sein, also kann man das Ausgangsformat auf diese Weise selbst festlegen. Allerdings gibt es auch hier ein paar Häkchen: die temporär erstellte Bitmap hat das 24Bit-Pixelformat (OK, ließe sich ändern), Transparenz wird somit wohl flöten gehen, und sowohl Ziel- als auch Ausgangsgrafik müssen zuweisungskompatibel zu TBitmap sein.
Blup
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 165
Erhaltene Danke: 42



BeitragVerfasst: Mo 15.09.14 09:14 
user profile iconLittleBen hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconLittleBen hat folgendes geschrieben Zum zitierten Posting springen:

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.

user profile iconLittleBen hat folgendes geschrieben Zum zitierten Posting springen:

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.

user profile iconLittleBen hat folgendes geschrieben Zum zitierten Posting springen:

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.
ausblenden 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.