AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Welche Bitmap-Größen sind machbar?

Ein Thema von Harry Stahl · begonnen am 20. Okt 2020 · letzter Beitrag vom 20. Okt 2020
Antwort Antwort
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.537 Beiträge
 
Delphi 11 Alexandria
 
#1

Welche Bitmap-Größen sind machbar?

  Alt 20. Okt 2020, 19:07
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").
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#2

AW: Welche Bitmap-Größen sind machbar?

  Alt 20. Okt 2020, 19:22
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
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (20. Okt 2020 um 19:33 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.537 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Welche Bitmap-Größen sind machbar?

  Alt 20. Okt 2020, 19:42
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....

Geändert von Harry Stahl (20. Okt 2020 um 19:49 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#4

AW: Welche Bitmap-Größen sind machbar?

  Alt 20. Okt 2020, 20:31
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;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.537 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Welche Bitmap-Größen sind machbar?

  Alt 20. Okt 2020, 21:53
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)...

Geändert von Harry Stahl (20. Okt 2020 um 22:00 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#6

AW: Welche Bitmap-Größen sind machbar?

  Alt 20. Okt 2020, 22:25
"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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (20. Okt 2020 um 23:03 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:00 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