Nomraal reserveert CreateDIBSection memory voor een pointer die je meegeeft en geeft die pointer terug.
Is het ook mogelijk om deze functie naar je eigen memory te laten wijzen?
Nomraal reserveert CreateDIBSection memory voor een pointer die je meegeeft en geeft die pointer terug.
Is het ook mogelijk om deze functie naar je eigen memory te laten wijzen?
Ja, een beetje. De functie accepteert een hSection handle.
hSection kan null zijn, of je kan er een filemapping aan meegeven, die je hebt opgevraagd met CreateFileMapping.
(zie CreateDIBSection documentatie)
CreateFileMapping geeft normaal gesproken een memory mapped view van een specifieke geopende file terug, maar je kan INVALID_HANDLE_VALUE opgeven als filehandle en een specifieke grootte aangeven, om een blok van die grootte terug te krijgen.
(zie CreateFileMappingA documentatie)
Het geheugen in kwestie is deel van de system paging file (het virtual memory) van Windows. Aan jou om te bepalen of je dat vindt gelden als 'eigen' memory.
1+1=b
Ik zag het ja. De INVALID_HANDLE_VALUE had ik even niet gezien.
Is dit net zo snel als getmem? Zo ja dan is het misschien test- en zelfs bruikbaar :-)
Lijkt goed te werken!
Code:procedure Test; var filemapping: THandle; bitmapinfo: TBitmapInfo; fBits: PPixelArray; // = pointer to array[0..0] of Cardinal bitmaphandle: HBITMAP; begin filemapping := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_EXECUTE_READWRITE, 0, 32 * 32 * 4, nil); if filemapping = 0 then raise exception.Create('filemapping = 0'); FillBitmapInfo(32, 32, bitmapinfo); // init bitmapinfo bitmaphandle := CreateDIBSection(0, bitmapinfo, DIB_RGB_COLORS, Pointer(fBits), filemapping, 0); if bitmaphandle = 0 then raise exception.Create('bitmaphandle = 0'); // fill for var x := 0 to 31 do for var y := 0 to 31 do if odd(y) then fbits^[y * 32 + x] := clGreen else fbits^[y * 32 + x] := clRed; // test var b: TBitmap := TBitmap.Create; b.SetSize(32, 32); for var x := 0 to 31 do for var y := 0 to 31 do b.Canvas.Pixels[x, y] := fbits^[y * 32 + x]; b.SaveToFile('kanweg.bmp'); b.Free; CloseHandle(filemapping); DeleteObject(bitmaphandle); end;
Misschien is CreateFileMappingNumaA ook een alternatief?
Ik heb geen idee. Ik heb alleen m'n google-resultaten in een antwoord gegoten. #HetIsNetWerk
1+1=b
@Golez hahaha. #agree
CreateFileMapping + CloseHandle is wel heel veel langzamer dan getmem + freemem :-(
Kan ik me voorstellen. GetMem zou zomaar eens een stuk al gereserveerd geheugen kunnen gebruiken.
De vraag is, is het eenmalig langzamer of ook in het gebruik? Indien het eerste, dan zal het neem ik aan geen probleem zijn, tenzij het echt secondenlang duurt of je duizenden bitmaps wilt verwerken.
1+1=b
Ik moet nog even echt kijken en meten. duizenden bitmaps inderdaad.
Misschien kan je een eenmaal verkregen buffer hergebruiken?
1+1=b
Dat ben ik nog aan het zoeken :-) Ik geloof dat het kan
vraag is waarom filemapping nodig is voor CreateDIBSection en eigenlijk of CreateDIBSection wel gebruikt moet worden. Ik dacht ooit eens wat testen gelezen te hebben waarbij scanline nog steeds sneller was (ook al gebruikt die CreateDIBSection). Maar deze info heeft geen waarde als je niet aan pixel manipulatie wilt (gaan) doen
Het subdoel van het geheel is om een DC te hebben voor BitBlt, Canvas-functies en Fonts etc. Deze functies moeten 'mijn' HDC kunnen gebruiken, maar het reserveren van geheugen wil ik in eigen hand houden.
De CreateDIBSection alloceert zelf zijn memory. En dat willen we niet.
Na de call naar CreateDIBSection is de fPixels pointer veranderd. Wat doe ik fout? Of liever: hoe kan het anders?
Code:1. fPixels : Pointer GetMem(fPixels, NumPixels * 4); 2. fBitmapInfo : TBitmapInfo Gevuld met correcte info 3. fMemoryHandle : THandle CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_EXECUTE_READWRITE, 0, NumPixels * 4, nil) 4. fBitmapHandle : HBITMAP CreateDIBSection(0, fBitmapInfo, DIB_RGB_COLORS, fPixels, fMemoryHandle, 0) 5. fHandle : HDC CreateCompatibleDC(0) 6. SelectObject(fHandle, fBitmapHandle)
There are currently 1 users browsing this thread. (0 members and 1 guests)
Bookmarks