![]() |
Dynamisches Array Grenze?
Beim einlesen vom Desktop hat mein Array eine grenze von 1920x1200 = 2304000
Gibt es eine Obergrenze in Delphi für dynamische Arrays also 65535 ? Denke nicht oder? Auf jedenfall tritt jetzt ein Fehler auf Zitat:
Kann ja nicht über 2 Millionen Pixel debuggen. EDIT: 131071 macht er zu größer scheint das Array nicht zu dimensionieren zu sein. CreateDIBSection will nicht mehr rausspucken. Das ist mein Problem denke ich nicht das Array. Was für ein Sch...s gruss |
AW: Dynamisches Array Grenze?
![]() Solltest eigentlich genug Platz haben. Oder habe ich da was falsch verstanden? Mehr kann ich leider nicht dazu sagen EDIT: Ich hätte besser noch weiter gelesen. Hier steht noch was zur Praxis: ![]() Das hätte das Problem erklären können, hätte es am Array gelegen ;) |
AW: Dynamisches Array Grenze?
Delphi-Quellcode:
Das währe die technische Seite. (Referenzzählung+Länge+Daten)
MaxLength := (High(Integer) - 2 * SizeOf(Integer)) div SizeOf(MyArray[0]);
// für 32-Bit-Delphi type TMyArray = array of XXX; MaxLength := ($7FFFFFFF - 8) div SizeOf(XXX); MaxLength := Trunc(2147483639 / SizeOf(XXX)); > stackoverflow erzählt halt manchmal auch nur Mist. Real ist nur soviel möglich, wie der größte zusammenhängende freie Speicherblock an Platz bietet. |
AW: Dynamisches Array Grenze?
Zitat:
Wieder mal ein Delphi problem in C++ gibts das nicht. grrr.. Pixels sind nicht vollständig. gruss |
AW: Dynamisches Array Grenze?
Zitat:
|
AW: Dynamisches Array Grenze?
Zitat:
Dann sag mir doch mal bitte welchen Einfluss ich auf CreateDIBSection nehmen kann wenn ich nur 131071 Pixel zurück geiefert bekomme? Bekomme ich mehr gebe ich dir recht .. andernfalls na ja du weist schon ;) Code? OK!
Delphi-Quellcode:
begin
hRetBmp := 0; if hBmp <> 0 then begin hBufferDC := CreateCompatibleDC(0); if hBufferDC <> 0 then begin hTmpBitmap := 0; if hBmpDC <> 0 then if (hBmp = GetCurrentObject(hBmpDC, OBJ_BITMAP)) then begin hTmpBitmap := CreateBitmap(1, 1, 1, 1, nil); SelectObject(hBmpDC, hTmpBitmap); end; hPrevBufObject := SelectObject(hBufferDC, hBmp); hDirectDC := CreateCompatibleDC(0); if hDirectDC <> 0 then begin GetObject(hBmp, sizeof(bm), @bm); ZeroMemory(@bmInfo, sizeof(BITMAPINFO)); bmInfo.bmiHeader.biSize := sizeof(bmInfo.bmiHeader); bmInfo.bmiHeader.biWidth := bm.bmWidth; bmInfo.bmiHeader.biHeight := bm.bmHeight; bmInfo.bmiHeader.biPlanes := 1; bmInfo.bmiHeader.biBitCount := 32; hDirectBitmap := CreateDIBSection(hDirectDC, bmInfo, DIB_RGB_COLORS, Pointer(Pixels), 0, 0); if hDirectBitmap <> 0 then gruss |
AW: Dynamisches Array Grenze?
Delphi-Quellcode:
hab mir den aufräum Code jetzt mal gespart
var
tempBitmap: BITMAPINFO; pvBits: Pointer; mDC: THandle; mainBitmap: Thandle; x, y: integer; q: ^TRGBTriple; idx: integer; begin ZeroMemory(@tempBitmap, sizeof(BITMAPINFO)); tempBitmap.bmiHeader.biSize := SizeOf(BITMAPINFOHEADER); tempBitmap.bmiHeader.biBitCount := 24; tempBitmap.bmiHeader.biWidth := 1920; tempBitmap.bmiHeader.biHeight := 1080; tempBitmap.bmiHeader.biPlanes := 1; tempBitmap.bmiHeader.biCompression := BI_RGB; tempBitmap.bmiHeader.biSizeImage := tempBitmap.bmiHeader.biWidth * tempBitmap.bmiHeader.biHeight * 3; mDC := CreateCompatibleDC(0); mainBitmap := CreateDIBSection(mDC, tempBitmap, DIB_RGB_COLORS, pvBits, 0, 0); SelectObject(mDC, mainBitmap); FillChar(pvBits^, tempBitmap.bmiHeader.biWidth * tempBitmap.bmiHeader.biHeight * 3, 255); for y := 0 to tempBitmap.bmiHeader.biHeight - 1 do begin for x := 0 to tempBitmap.bmiHeader.biWidth - 1 do begin idx := y * tempBitmap.bmiHeader.biWidth + x; q := Pointer(Integer(pvBits) + idx * 3); q.rgbtBlue := Round(x * 255 / tempBitmap.bmiHeader.biWidth); q.rgbtRed := Round(y * 255 / tempBitmap.bmiHeader.biHeight); q.rgbtGreen := 55; end; end; BitBlt(canvas.Handle, 0, 0, tempBitmap.bmiHeader.biWidth, tempBitmap.bmiHeader.biHeight, mDC, 0, 0, SRCCOPY); -> du setzt bei dir die Bildgroesse nicht: bmInfo.bmiHeader.biBitCount := tempBitmap.bmiHeader.biWidth * tempBitmap.bmiHeader.biHeight * tempBitmap.bmiHeader.biBitCount div 8 |
AW: Dynamisches Array Grenze?
Nu was ist bei dir anders als bei mir?
Im Pointer(Pixels) ist das array welches von CreateDIBSection zurück geliefert wird. Das ist ja das schöne daran das ich mir so das suchen der pixels mit GetPixel sparen kann. Was soll ich nun machen das mir die richtige Anzahl abhängig vom Bild (Bilddimension) zurückgegeben wird? gruss |
AW: Dynamisches Array Grenze?
Hab gestern dynamische Arrays gebraucht. Da war Schluss bei 33 Mio. Elementen und einem theoretischen Ramverbrauch von Arraycount x Elementsize(40 Bytes) = 1,3GB. Grösser ging dann nicht mehr. Win7 32bit, kein 3GB Switch aktiviert.
|
AW: Dynamisches Array Grenze?
Zitat:
Habe ja schon festgestellt woran es liegt CreateDIBSection gibt mir nicht die korrekte anzahl an pixel gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz