AGB  ·  Datenschutz  ·  Impressum  







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

Dynamisches Array Grenze?

Ein Thema von EWeiss · begonnen am 28. Mär 2012 · letzter Beitrag vom 29. Mär 2012
Antwort Antwort
Seite 1 von 2  1 2      
EWeiss
(Gast)

n/a Beiträge
 
#1

AW: Dynamisches Array Grenze?

  Alt 28. Mär 2012, 19:28
http://stackoverflow.com/questions/9...rray-in-delphi

Solltest eigentlich genug Platz haben. Oder habe ich da was falsch verstanden? Mehr kann ich leider nicht dazu sagen
JO liegt nicht am Array das problem ist CreateDIBSection gibt mir nicht mehr wie 131071 Pixel.
Wieder mal ein Delphi problem in C++ gibts das nicht.

grrr..

Pixels sind nicht vollständig.

gruss

Geändert von EWeiss (28. Mär 2012 um 21:06 Uhr)
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#2

AW: Dynamisches Array Grenze?

  Alt 28. Mär 2012, 20:48
http://stackoverflow.com/questions/9...rray-in-delphi

Solltest eigentlich genug Platz haben. Oder habe ich da was falsch verstanden? Mehr kann ich leider nicht dazu sagen
JO liegt nicht am Array das problem ist CreateDIBSection gibt mir nicht mehr wie 131071 Pixel.
Wieder mal ein Delphi problem in C++ gibts das nicht.

grrr..

gruss
Das ist mit Sicherheit kein Delphi Problem weils ne WinAPI ist die genauso unter Delphi wie auch unter C++ funktioniert. Das Problem wird da eher vorm Bildschirm sitzen
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Dynamisches Array Grenze?

  Alt 28. Mär 2012, 21:09
Das Problem wird da eher vorm Bildschirm sitzen
Ach ja?
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

Geändert von EWeiss (28. Mär 2012 um 21:12 Uhr)
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#4

AW: Dynamisches Array Grenze?

  Alt 28. Mär 2012, 21:37
Delphi-Quellcode:
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);
hab mir den aufräum Code jetzt mal gespart

-> du setzt bei dir die Bildgroesse nicht: bmInfo.bmiHeader.biBitCount := tempBitmap.bmiHeader.biWidth * tempBitmap.bmiHeader.biHeight * tempBitmap.bmiHeader.biBitCount div 8
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Dynamisches Array Grenze?

  Alt 28. Mär 2012, 21:48
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
  Mit Zitat antworten Zitat
Benutzerbild von isilive
isilive

Registriert seit: 15. Okt 2008
Ort: Österreich
192 Beiträge
 
Delphi 2009 Professional
 
#6

AW: Dynamisches Array Grenze?

  Alt 28. Mär 2012, 21:58
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.
Stefan
Jedoch kann die referenzbasierte Implementierung des Standard-Objektmodells in Kombination mit den komplexen syntaktischen Dereferenzierungsregeln bei einer objektorientierten API wie ein Stolperstein wirken.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: Dynamisches Array Grenze?

  Alt 28. Mär 2012, 22:01
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.
Das ist auch nicht mein problem.. Danke schön
Habe ja schon festgestellt woran es liegt CreateDIBSection gibt mir nicht die korrekte anzahl an pixel

gruss
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Dynamisches Array Grenze?

  Alt 29. Mär 2012, 01:27
Im MSDN reiten die für hSection so auf NULL herum, dann würde die API auch den Speicher reservieren. Wenn nicht NULL, dann muss man den Speicher selber bereitstellen.

Also evtl. so?
hDirectBitmap := CreateDIBSection(hDirectDC, bmInfo, DIB_RGB_COLORS, Pointer(Pixels), NULL, 0);
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: Dynamisches Array Grenze?

  Alt 29. Mär 2012, 02:10
Das werd ich mal testen Danke.
Nur wo ist NULL deklariert .. hmm OK in Variants

Leider nicht
Zitat:
Erste Gelegenheit für Exception bei $7715B9BC. Exception-Klasse EVariantTypeCastError mit Meldung 'Variante des Typs (Null) konnte nicht in Typ (Int64) konvertiert werden'. Prozess DimmedTest.exe (344)
Zitat:
dann muss man den Speicher selber bereitstellen.
Wenn ich jetzt wüßte wie, bezogen auf diese function, dann wäre es ja gut

EDIT:
Sieht so aus
Zitat:
If hSection is not NULL, it must be a handle to a file mapping object created by calling the CreateFileMapping function.
Mein Problem das ich aber habe verfüge nur über ein HBitmap und lade keine Datei.
Könnte den hFile parameter mit INVALID_HANDLE_VALUE befüllen aber ob es damit getan ist?
Warum stellt Delphi den Parameter NULL zur verfügung wenn es nicht damit umgehen kann.
Oder ich bin einfach zu

In C++ sieht es so aus
Code:
HBITMAP hBitmap = CreateDIBSection(hDC, (BITMAPINFO*)&bmi, DIB_RGB_COLORS,(void**)&ppvBits , NULL, 0);
Anders hab ich es auch nicht, abgesehen von "NULL"
Hab mit CreateDIBSection schon viel gemacht aber das schlägt dem Fass den Boden aus.

gruss

Geändert von EWeiss (29. Mär 2012 um 04:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Dynamisches Array Grenze?

  Alt 29. Mär 2012, 08:11
Zitat:
Nur wo ist NULL deklariert .. hmm OK in Variants
Fast, das NULL ist Variants ist ein Variant mit dem Wert NULL,
aber das hat mit diesem NULL nichts gemeinsam.

nil oder 0, je nach dem, ob der Parameter als Zeigertyp oder als ordinaler Typ deklariert ist.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 23:32 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