Toon posts:

Win32 'LoadImage' probleem

Pagina: 1
Acties:
  • 146 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hallo!

Ik heb een app gemaakt waarbij ik een 3000x2225 pixels 24-bits bitmap in het geheugen wil laden.

Nu heb ik daarvoor de onderstaande procedure 'Laad_Bitmap_3000x2225' gebruikt. Onder Windows XP (PC met 256 mb RAM, display instelling 32-bit) wordt de bitmap zonder problemen in het geheugen geladen (zover ik begrepen heb van de Win32 API als Device Dependent Bitmap).

Echter als ik de app op Windows 98 (PC met 128 mb RAM, display instelling 24 bits) draai dan wilt ie de bitmap niet meer laden met de procedure 'Laad_Bitmap_3000x2225'. De handle die dan geretourneerd wordt is dan 0.

Als ik dan probeer onder Windows 98 diezelfde bitmap te laden, maar dan in een andere resolutie (2048x1536) met de procedure 'Laad_Bitmap_2048x1536', wordt de bitmap zonder problemen in het geheugen geladen.

Kan iemand mij misschien vertellen hoe dit komt/ wat ik fout doe??? Bij voorbaat hartelijk dank!!!

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
var Bitmap: HBitmap;

procedure Laad_Bitmap_3000x2225;
begin
 Bitmap := LoadImage (HInstance, PChar ('Test.bmp'), IMAGE_BITMAP, 3000, 2225, LR_LOADFROMFILE);
 if Bitmap = 0 then MessageBox (0, 'Bitmap Error', 'Function ''LoadImage'' failed to load bitmap.', MB_OK);
end;

procedure Laad_Bitmap_2048x1536;
begin
 Bitmap := LoadImage (HInstance, PChar ('Test.bmp'), IMAGE_BITMAP, 2048, 1536, LR_LOADFROMFILE);
 if Bitmap = 0 then MessageBox (0, 'Bitmap Error', 'Function ''LoadImage'' failed to load bitmap.', MB_OK);
end;

[ Voor 28% gewijzigd door Verwijderd op 12-03-2003 13:05 ]


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

De onderste is identiek aan de bovenste. Te veel Copy/Paste? :)

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
LordLarry schreef op 12 maart 2003 @ 12:43:
De onderste is identiek aan de bovenste. Te veel Copy/Paste? :)
Sorry... je hebt gelijk... |:( ik heb de bovenstaande post net even aangepast.

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Weet je 100% zeker dat de plaatjes identiek zijn afgezien van de hoogte en breedte? Toch niet misschien een andere kleurdiepte.

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
LordLarry schreef op 12 maart 2003 @ 13:07:
Weet je 100% zeker dat de plaatjes identiek zijn afgezien van de hoogte en breedte? Toch niet misschien een andere kleurdiepte.
In beide procedures wordt dezelfde bitmap 'Test.bmp' (resolutie 3000x2225 24-bit) geladen uit een bitmapfile.

Op de PC met Windows XP en op de PC met Windows 98 staat een identieke exe en 'Test.bmp' (ik heb het net voor de goede orde nog eens nagekeken).

[ Voor 20% gewijzigd door Verwijderd op 12-03-2003 13:16 ]


  • Dala
  • Registratie: November 2000
  • Laatst online: 23-08 20:51
aan de code te zien is het Delphi?


misschien dat er even bijzetten?

Verwijderd

Topicstarter
Dala schreef op 12 maart 2003 @ 13:46:
aan de code te zien is het Delphi?


misschien dat er even bijzetten?
Klopt, de app is geschreven met Win32 API in Delph 6 Personal Edition.

  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Er is in win95 en 98 een limitatie op de resource grootte, kijk hier maar eens:
http://support.microsoft....?scid=kb%3ben-us%3b182819
If you add a large resource (greater than or equal to 64K in size) to a Win32 module and you attempt to access any resource in the image from 16- bit code under Windows 95 or Windows 98, the resource might get truncated. Since large sections of the Windows 95 or Windows 98 user interface manager (USER) are implemented in 16-bit code for compatibility reasons, resource-loading functions such as LoadImage might fail or return corrupted resources. Your access to resources from 32-bit code are not affected.
Het is dus een bug ontstaan door 16-bit code in het systeem die aangeroepen wordt door functies als LoadBitmap etc.
Op bovenstaande site staat ook een tooltje om het een en ander te fixen in je exe, heb het nooit gebruikt maar misschien helpt het.

www.madwizard.org


Verwijderd

Topicstarter
madwizard schreef op 12 March 2003 @ 17:25:
Er is in win95 en 98 een limitatie op de resource grootte, kijk hier maar eens:
http://support.microsoft....?scid=kb%3ben-us%3b182819

[...]

Het is dus een bug ontstaan door 16-bit code in het systeem die aangeroepen wordt door functies als LoadBitmap etc.
Op bovenstaande site staat ook een tooltje om het een en ander te fixen in je exe, heb het nooit gebruikt maar misschien helpt het.
Hardstikke bedankt voor je hulp! :)

Zou iemand mij misschien kunnen vertellen hoe je met 'LoadBitmap' een bitmap uit een bitmap-bestand in het geheugen kunt laden???
(In de Win32 API help van Microsoft betreffende 'LoadBitmap' staat hierover niets vermeld :?)

  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

In C++ iig zo dacht ik:
[code=c++]HRSRC hRsrc = FindResource(hInstance,
MAKEINTRESOURCE(IDB_BITMAP1),
RT_BITMAP);
HGLOBAL hGlobal = LoadResource(hInstance, hRsrc);
BITMAPINFO *pBmpInfo =
reinterpret_cast<BITMAPINFO*>(LockResource(hGlobal));[/code]
Ik geloof dat de uiteindelijk data pointer een BITMAPINFO was maar weet het niet zeker. Je hoeft verder geen FreeResource ofzo aan te roepen (staat in de lijst van Obsolete Windows Programming Elements), in feite maak je ook niets nieuws aan want resources zijn allang al in het geheugen geladen, je hoeft alleen maar de goede pointer te zoeken (bij LoadImage etc wel want daar maak je ook echt een bitmap aan).


edit -- oeps je bedoelde echt uit een bestand? LoadImage heeft een LR_LOADFROMFILE flag:
Loads the image from the file specified by the lpszName parameter. If this flag is not specified, lpszName is the name of the resource.

[ Voor 20% gewijzigd door madwizard op 12-03-2003 19:57 ]

www.madwizard.org


Verwijderd

Topicstarter
edit -- oeps je bedoelde echt uit een bestand? LoadImage heeft een LR_LOADFROMFILE flag:
Inderdaad, de flag 'LR_LOADFROMFILE' heb ik ook gebruikt:

Delphi:
1
Bitmap := LoadImage (0, PChar ('BitmapNaam.bmp'), IMAGE_BITMAP, 3000, 2225, LR_LOADFROMFILE);


Wat ik wel vreemd vind is dat in Windows 98 een programma zoals bijvoorbeeld MSPaint de bitmap van 3000x2225 pixels en 24 bit wel gewoon kan openen.

Het lijkt erop dat het laden van de bitmap van een file in het geheugen wel mogelijk moet zijn, maar de Win32 API functie 'LoadImage' kan hier blijkbaar niet voor gebruikt worden.

Heeft wellicht iemand een andere methode / oplossing om een bitmap van 3000x2225 pixels en 24 bit in Windows 98 te kunnen laden van file naar het geheugen???

Alvast hartelijk bedankt !!!

  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Had ik niet gezien die LR_LOADFROMFILE in je eerste post.. LoadBitmap is een oude functie, LoadImage is de goede manier dus ik denk niet dat LoadBitmap meer functionaliteit biedt.

CreateBitmap/CreateDIBitmap/CreateCompatibleBitmap/CreateBitmapIndirect:
Windows 95/98/Me: The created bitmap cannot exceed 16MB in size
Bij CreateDIBSection staat dit niet, misschien dat het daarmee lukt..
Als dat ook niet werkt kun je natuurlijk een kleinere bitmap maken (600x445 bijvoorbeeld), en daarin steeds een deel van de bitmap data zetten (kwestie van een stukje geheugen kopieren) en stukje voor stukje BitBlt'en op de DC waar je em op wilt hebben.

Maar CreateDIBSection lijkt me makkelijker, als je even makkelijk wilt testen of dat werkt (heb zelf geen 98 meer geinstalleerd dus kan het niet voor je doen), download dan PNGview van m'n site (hier ergens), maak een PNGtje van 3000x2225 (24/32bpp) en probeer het er mee te openen. Intern gebruikt het programma CreateDIBSection om de geladen PNG in op te slaan dus als het daar werkt moet het jou ook lukken.
edit:
getest in winxp, 5000x4000x24 ging zonder problemen met PNGview

[ Voor 5% gewijzigd door madwizard op 12-03-2003 21:02 ]

www.madwizard.org


Verwijderd

Topicstarter
madwizard schreef op 12 March 2003 @ 20:56:
Maar CreateDIBSection lijkt me makkelijker, als je even makkelijk wilt testen of dat werkt (heb zelf geen 98 meer geinstalleerd dus kan het niet voor je doen), download dan PNGview van m'n site (hier ergens), maak een PNGtje van 3000x2225 (24/32bpp) en probeer het er mee te openen. Intern gebruikt het programma CreateDIBSection om de geladen PNG in op te slaan dus als het daar werkt moet het jou ook lukken.
edit:
getest in winxp, 5000x4000x24 ging zonder problemen met PNGview
Hardstikke bedankt voor je hulp !!! :)

Ik zal proberen of het lukt met de functie 'CreateDIBSection', of het al dan niet lukt zal ik nog wel hier posten!
Pagina: 1