Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Welche Bitmap-Größen sind machbar? (https://www.delphipraxis.net/205821-welche-bitmap-groessen-sind-machbar.html)

Harry Stahl 20. Okt 2020 18:07

Welche Bitmap-Größen sind machbar?
 
Weiß jemand, wie man die maximal zulässigen Größen (also Breite und Höhe) für (normale Windows-) Bitmaps berechnen kann (also, z.B. wenn das Format 24-bit oder 32-bit ist, oder nur 4 bit, usw)?

Bei meinen Tests konnte ich z.B. eine 26.699 x 26.699 große 24-Bit-bitmap erzeugen (in einem 64-Bit-Programm), aber nur eine ca. 23.000 x 23.000 große 32-Bitmap (bei allem was wohl nicht erlaubt ist, kommt die Fehlermeldung "falscher Parameter").

himitsu 20. Okt 2020 18:22

AW: Welche Bitmap-Größen sind machbar?
 
Da im BMP-Header die Felder für Dateigröße (uint32) und Width/Height (int32) sind, wären theoretisch
2*2 Milliarden Pixel mit insgesamt bis 4 GB Dateigröße möglich.
Aber durch die 4 GB sind es bei 32 bpp somit maximal 32.700 x 32.700 (oder z.B. 66.830.000 x 16).

ABER da du das Bitmap als einen Block im Speicher liegen hast, sind in 32 Bit Windows effektiv etwa bis 150.000 32 Bit-Pixel möglich, also 12.000 x 12.000.
Da es durch die Speicherfragmentierung erfahrungsgmäß selten zuverlässig gelingt mehr als 600 MB zusammenhängend zu finden, in einem "realen" und etwas größeren und längerlaufendem Programm.

Bei 32 Bit mit 4 GB-Option (IMAGE_FILE_LARGE_ADDRESS_AWARE) oder besser noch mit 64 Bit, da wird es einfacher ausreichend Speicher zu finden.


Und im FMX ist TBitmap ... nja, da kannst es gleich vergessen.
https://www.delphipraxis.net/205291-...mx-vs-vcl.html

Harry Stahl 20. Okt 2020 18:42

AW: Welche Bitmap-Größen sind machbar?
 
IMAGE_FILE_LARGE_ADDRESS_AWARE habe ich seit Version 10 meines Programmes in der 32-Bit-Version aktiviert, so dass ich da auch z.B. das hier schon mal öfter erwähnt "Weltbild" von 21.600 x 10.800 Bildpunkten laden kann.

Aber ich dachte es müsste in der 64-Bit-Version meines Programmes maximal 32.000 x 32.000 möglich sein, aber mehr als ungefähr 26.699 x 26.699 (24-Bit-Bitmap) kann ich nicht erzeugen. Ich würde daher gerne eine Überprüfung einbauen, was der User als maximale Größe angeben kann, weiß aber nicht, wie ich das sinnvoll berechnen kann, zumal mir nicht wirklich klar, ist, was die maximale Größe sein soll, beim Googlen bin ich da immer wieder auf unterschiedliche Aussagen gestoßen....

himitsu 20. Okt 2020 19:31

AW: Welche Bitmap-Größen sind machbar?
 
Wieviel Speicher hast erstmal noch maximal übrig, für dein Bitmap? (der größte Wert)

Vom FastMM könnte man sich eine Memory-Map erstellen lassen, aber so reicht es auch aus.
Delphi-Quellcode:
var
  M: array[0..31] of UInt32;
  P: array[0..31] of Pointer;
  i: UInt32;
begin
  FillChar(M, SizeOf(M), 0);
  FillChar(P, SizeOf(P), 0);
  i := 0;
  while i <= High(M) do begin
    M[i] := 4195352576; // 4000+1 MB
    repeat
      Dec(M[i], 1048576);
      P[i] := GetMemory(M[i]);
    until (M[i] = 0) or Assigned(P[i]);
    Inc(i);
  end;
  for i := 0 to High(P) do
    FreeMemory(P[i]);
  for i := 0 to High(P) do
    Memo1.Lines.Add((M[i] / 1048576).ToString+' MB');
end;

Harry Stahl 20. Okt 2020 20:53

AW: Welche Bitmap-Größen sind machbar?
 
Auf meinem Entwicklungs-PC ca. 5,7 GB frei, auf dem Vertriebsrechner 12 GB freier Arbeitsspeicher, das sollte ja reichen.

Dennoch gehts nicht größer als oben genannt... (also das sind die Werte, die mein Programm mir sowieso anzeigt, was Dein Source-Code da macht, versteh ich leider nicht, jedenfalls nicht so auf die Schnelle)...

himitsu 20. Okt 2020 21:25

AW: Welche Bitmap-Größen sind machbar?
 
"Arbeitsspeicher" hat absolut nichts zu sagen.

Klar, wenn RAM+Auslagerungsdatei voll sind, dann schon, aber die Grenze ist selten Erreicht und leicht erweiterbar (größere Auslagerungsdatei).
Die Fragmentierung dieses Speichers ist auch total irrelevant, da fast alles verschiebbar ist.
Hier steht ein kleiner Rechner mit 63 Kernen und 98 GB RAM (40 GB Frei), aber das sag nicht aber auch garnichts aus, darüber was ein Programm Prozess nutzen kann.

Der virtuelle Speicher der Anwendung ist das Wichtige.


Der Code schaut/probiert einfach nur, was sich wirklich als Speicher reservieren lässt.
In einem Testprogramm, wo sonst nichts drin läuft und das auch grad eben erst gestartet wurde, ist das Ergebnis schnell mal anders, also wenn ein Programm schon 'nen paar Minuten/Stunden/Tage lief und wo auch schon bissl mehr drin abgeht und wieviel vorher auch schon gearbeitet wurde.


Und das was der Taskmanager anzeigt, sagt auch nicht viel aus, vor allem nicht das von der standardmäßig angezeigten Spalte "Arbeitsspeicher".
"Zugesichertet Speicher" wäre schon besser, aber schon bei der nachfolgenden Demo wirst dich bestimmt selbst wundern, dass die angezeigten Werte so nicht stimmen können. (nichtmal 3 MB)
99000*5000 ergibt bei 24 Bit eine 1,4 GB kleine BMP-Datei.
Delphi-Quellcode:
program Project2;

uses
  SysUtils, Graphics;

begin
  with TBitmap.Create do begin
    SetSize(99000, 5000);
   {for var X := 0 to Width-1 do
      for var Y := 0 to Height-1 do
        Canvas.Pixels[X, Y] := Random($FFFFFF);}
    while True do
      Canvas.Pixels[Random(Width), Random(Height)] := Random($FFFFFF);
  end;
  Sleep(99999);
end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:39 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