Autor Beitrag
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Quizmaster
Beiträge: 2601
Erhaltene Danke: 1375

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: So 25.01.15 22:53 
Hallo,
ich lade aus einer Ressource ein JPG-Bild mit
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
var r :TResourceStream;
    j :TJpegImage;
begin
    r := TResourceStream.Create(hinstance, kk, 'Jpeg');
    j := TJpegImage.Create;
    try
      j.LoadFromStream(r);
      Image.Picture.Bitmap.Assign(j);
    finally
      j.Free;
      r.Free;
    end;
end;
und weise es einem Image zu. Funktioniert problemlos. Das JPG-Bild ist 165 KB groß und hat die Abmessungen 1600 x 1200 Pixel.

Sobald die Abbildung im Image ist, werden entsprechend der Bildgröße bei 24 Bit-Farbtiefe sofort mehr als 5 MB Arbeitsspeicher vereinnahmt. 5 MB sind nicht extrem viel, jedoch mehr als das Programm sonst benötigt. Farbtiefe oder Abmessungen verringern, geht leider nicht.
Gibt es eine Möglichkeit dem Image "abzugewöhnen", die Abbildung als Bitmap zu halten? Würde es nur die 165 KB JPG-Größe benötigen, wäre es doch effektiver.

Danke für einen Hinweis und beste Grüße
Mathematiker

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10045
Erhaltene Danke: 1185

W2k .. W7pro .. W10ent
TP3 .. D7pro .. D10.1
BeitragVerfasst: So 25.01.15 23:49 
Moin!

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
Würde es nur die 165 KB JPG-Größe benötigen, wäre es doch effektiver.
Warum lädst du das JPG dann aus einer Ressource? Du kannst doch gleich das Bild in der IDE in die Eigenschaft .Picture laden, dann hast du genau den gewünschten Effekt (und das sogar zur Entwurfszeit). ;) Allerdings kannst du dann nicht per TCanvas drauf rummalen... :nixweiss: (das geht nur mit einem TBitmap :idea:)

Lass hier alternativ das .Bitmap weg, das sollte es auch tun:
Image.Picture.Bitmap.Assign(j);
Aber wie gesagt, wozu dann die Ressource... ? :P

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.

Für diesen Beitrag haben gedankt: Mathematiker
Mathematiker Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Quizmaster
Beiträge: 2601
Erhaltene Danke: 1375

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Mo 26.01.15 07:34 
Hallo Narses,
Danke für die Antwort.
user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Warum lädst du das JPG dann aus einer Ressource?

Einverstanden. Das Laden aus der Ressource ist nicht notwendig, da ich auch nicht darauf herumladen will.
Allerdings ändert das sofortige Einfügen der Abbildung nicht den Effekt, dass mehr als 5 MB Arbeitsspeicher zur Laufzeit blockiert werden. Kurios ist, dass es dann sogar 200 KB mehr sind.
Wie schon gesagt, sind die Werte nicht besorgniserregend, aber irgendwie stört es mich. Wahrscheinlich kann man aber da nicht viel machen.

user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Lass hier alternativ das .Bitmap weg, das sollte es auch tun:
Image.Picture.Bitmap.Assign(j);

Lasse ich .Bitmap weg, bekomme ich den gleichen Effekt, wie beim sofortigen Einfügen des Bildes. Der okkupierte Arbeitsspeicher wird ebenso 200 KB größer.
Sehr merkwürdig.

Beste Grüße
Mathematiker

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18691
Erhaltene Danke: 1620

W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 26.01.15 07:43 
Die alten Delphiversionen haben Bilder oft unnötig in Bitmaps umgewandelt. Erst in etwas aktuelleren Versionen werden PNGs oder JPEGs tatsächlich in der Regel intern als solche verwendet, sofern das möglich ist.

Die Frage ist was du damit machen möchtest. Bei Delphi 5 / 7 dürften die meisten Verwendungsarten ohnehin in einer Umwandlung in eine Bitmap resultieren, so dass der Arbeitsspeicher ohnehin irgendwann benutzt wird.

Für diesen Beitrag haben gedankt: Mathematiker
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 2



BeitragVerfasst: Mo 26.01.15 12:24 
@Mathematiker

Abgesehen von allem weshalb so und nicht anders: Eine JPG-Datei speichert eine Grafik komprimiert ab. Wenn die JPG-Datei auf der Platte nur 200 kb einnimmt, ist es durchaus möglich, daß die "entpackte" Grafik im Speicher das 10-, 20- oder 30-fache an Platz (Memory) benötigt. Eine dargestellte Grafik ist stets eine "entpackte" und niemals eine "komprimierte" Grafik.

Anders ausgedrückt: Würde man die reinen JPG-Daten als Grafik darzustellen versuchen, käme nur wüster Bildsalat heraus. Erst die Interpretation der JPG-Daten macht daraus ein erkennbares Bild, das natürlich mehr Platz beansprucht als die reinen JPG-Daten – was ja auch Sinn & Zweck des JPG-Formats ist. Lädst du die JPG-Datei in eine Ressource, werden dort die reinen JPG-Daten eingelesen, also die "komprimierte" Grafik, die dann meinetwegen nur 200 kb beansprucht. Zeigst du die Grafik dann in deiner Anwendung an, muß der JPG-Interpreter ja irgendwo hin mit den entpackten Daten, um sie darstellen zu können. Das "kostet" natürlich Speicher.

Diesbezüglich ist das nicht viel anders als der Unterschied zwischen Vektor- und Pixelgrafik: Die Vektor-Grafik-Datei (z.B. SVG) enthält lediglich Koordinaten und sonstige Meta-Informationen, also letztendlich Befehle, die auszuführen sind, um die vollständige Grafik zeichnen zu können, wobei die dadurch erzeugten Pixeldaten um ein Vielfaches größer sind als die Datei, die lediglich die Zeichen-Befehle enthält. Auch der Vergleich einer Zip-Datei mit einem darin verborgenen ausführbaren Programm veranschaulicht dasselbe: Du kannst die Zip-Datei nicht ausführen, dazu mußt du sie erst entpacken, und die daraus entstandene Exe ist um einiges größer als die Zip-Datei.

Für diesen Beitrag haben gedankt: Mathematiker
Mathematiker Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Quizmaster
Beiträge: 2601
Erhaltene Danke: 1375

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Mo 26.01.15 12:48 
Hallo,
Danke für die Antworten.
Es war nur so eine Idee, die ich hatte, dass es evtl. eine Möglichkeit gibt, irgendwie Speicher zu sparen.
Wird damit nichts und ganz so schlimm ist es nicht.

Beste Grüße
Mathematiker

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein