Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bitmap zwingt PC in die Knie (https://www.delphipraxis.net/104220-bitmap-zwingt-pc-die-knie.html)

Neutral General 29. Nov 2007 13:10


Bitmap zwingt PC in die Knie
 
Hi,

Also was mir so noch nie passiert ist, ist folgendes: Ich habe ein Image mit einem Bitmap drin auf meinem Formular und im Button steht folgender Code:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i,j: Integer;
    row: PRGBQuad;
    bmp: TBitmap;
    tmp: TBitmap;
begin
  bmp := Image1.Picture.Bitmap;
  bmp.PixelFormat := pf32Bit;
  tmp := TBitmap.Create;
  tmp.Width := bmp.Width*bmp.Height;
  tmp.Height := 256;
  tmp.PixelFormat := pf32Bit;
end;
Die Variablen i,j und row sind noch von Zeiten wo mit ihnen gearbeitet wurde. Hab entsprechende CodeTeile aber entfernt und so starte ich mein Programm, klicke auf den Button und mein PC geht sowas von in die Knie das er bestimmt (je nachdem wie man sich verhält) bis zu 5 Minuten unbedienbar ist. :shock:

Gruß
Neutral General

xaromz 29. Nov 2007 13:16

Re: Bitmap zwingt PC in die Knie
 
Hallo,

das kommt wohl auf die Größe des Ursprungsbildes an. Wenn Dein Original jewils 200 Pixel hoch und breit ist, bist Du ja schon bei 40 MB Bilddaten. Wenn Dein Originalbild etwas größer ist, wird das schnell ziemlich viel Speicher.

Außerdem solltest Du immer zuserst das Pixelformat setzen, da ja ansonsten erst Speicher allokiert wird, dann erneut ein (größerer) Speicherblock für das neue Format und schließlich erfolgt eine Konvertierung. Das kostet alles Zeit.

Gruß
xaromz

SirThornberry 29. Nov 2007 13:18

Re: Bitmap zwingt PC in die Knie
 
welche Werte hat bmp.width und bmp.height?
Zudem solltest du erst das Pixelformat setzen und danach die Größe.

Ansonsten wird erst das Bitmap mit der Größe angelegt, anschließend ein neues Bitmap mit der neuen Pixelformat und der neuen Größe angelegt, das alte Bitmap in das neue kopiert und das alte Bitmap frei gegeben

Wenn du erst das Pixelformat setzt wird hingegen das Pixelformat gesetzt (da Größe noch x:0 y:0 ist passiert nichts weiter) und mit setzen der Größe wird dann gleich das Bitmap in der richtigen Größe erstellt.

Bei neueren Delphiversionen gibt es bei TBitmap auch die Methode SetSize um Höhe und Breite gleichzeitig zu setzen (was aber in deinem Fall keine Rolle spielt weil es egal ist das die da Höhe beim setzen der Breite noch 0 ist)

Popov 29. Nov 2007 13:26

Re: Bitmap zwingt PC in die Knie
 
Wie groß ist den Image? Wenn du die Width von tmb berechnest indem du Width und Height von der Image multiplizierst, dann kann das erstens ein sehr großer Wert werden und zweitens ab einer bestimmten Größe wird dauert was wirklich lange. Obwohl Height von tmb noch 0 ist, aber es wird eine große Bitmap angelegt. So sind 1024 * 768 = 786432. Und das ist für eine Bitmap verdammt groß, eventuell sogar schon zu groß. Später wird auch noch Height vergrößert. Da sind paar MB schnell da.

SirThornberry 29. Nov 2007 13:33

Re: Bitmap zwingt PC in die Knie
 
@Popov: es dürfte erst beim setzen von height, und später nochmal beim setzen des pixelformat hängen.
Denn gehen wir von folgender Größe aus: 1024 * 768 = 786432
so ist: 786432(Breite) * 0(Höhe) = 0
Und somit wird zu diesem Zeitpunkt noch kein Speicher angefordert.

Popov 29. Nov 2007 13:52

Re: Bitmap zwingt PC in die Knie
 
Zitat:

Zitat von SirThornberry
@Popov: es dürfte erst beim setzen von height, und später nochmal beim setzen des pixelformat hängen.
Denn gehen wir von folgender Größe aus: 1024 * 768 = 786432
so ist: 786432(Breite) * 0(Höhe) = 0
Und somit wird zu diesem Zeitpunkt noch kein Speicher angefordert.

Das bezog sich nicht unbedingt auf die Höhe 0 sondern war allgemein zu verstehen. Und zweitens bezog sich die große Bitmap auf die eventuelle Breite von 786432. Auch bei Height 0 ist das schon eine große Bitmap. Heght 0 hin oder her, 3/4 Million Pixel Breite ist groß.

Neutral General 29. Nov 2007 14:30

Re: Bitmap zwingt PC in die Knie
 
Hi,

ja es ist mir auch eben erst bewusst geworden das das je nach Bildgröße ungeahnte Außmaße annimmt ....
Setzte jetzt das Pixelformat zuerst und jetzt hält sichs in Grenzen. Also große Bilder sind quasi unmöglich aber den Quelltext des Programms werde ich nichtmal speichern. Wollte nur was gucken. Von daher nicht so wichtig :wink:

Danke für die Erklärungen

Gruß
Neutral General


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:57 Uhr.

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