Seite 4 von 4
Verfasst: 07.07.2005 16:42
von computerkranker
Auf MSDN steht da was nicht so erfreuliches:
http://msdn.microsoft.com/library/defau ... s_87eb.asp
Windows 95/98/Me: The created bitmap cannot exceed 16MB in size.
Verfasst: 07.07.2005 16:45
von Zaphod
abgesehen davon, dass das nur unter win9x gilt, ist das eine einschränkung vom GDI. die sprite funktionen nutzen aber *ziemlich offensichtlich* directx.
Verfasst: 07.07.2005 17:01
von computerkranker
die sprite funktionen nutzen aber *ziemlich offensichtlich* directx.
Wir reden hier vom Image’s und der IMAGE LIB bzw. der darin benutzten API-Funktionen.
Verfasst: 07.07.2005 18:31
von computerkranker
Nach all den Versuchen,Tests und der netten Hilfe hier die erste brauchbare Lösung.
Code: Alles auswählen
Structure PB_StructureImage
Bitmap.l
Width.w
Height.w
Depth.w
ColorArray.l
EndStructure
Structure BitmapInf
biSize.l
biWidth.l
biHeight.l
biPlanes.w
biBitCount.w
biCompression.l
biSizeImage.l
biXPelsPerMeter.l
biYPelsPerMeter.l
biClrUsed.l
biClrImportant.l
rgbBlue.b
rgbGreen.b
rgbRed.b
rgbReserved.b
EndStructure
Procedure IMAGE_GetOrAllocImageSpace(Number)
!EXTRN _PB_Image_GetOrAllocateID
!MOV EAX,[Esp]
!CALL _PB_Image_GetOrAllocateID
ProcedureReturn
EndProcedure
Procedure CreateImage_Test(Number,Width,Height,BitColor)
DC=CreateDC_("DISPLAY",#Null,#Null,#Null)
If GetObjectType_(DC)=0:ProcedureReturn 0:EndIf
bmp.BitmapInf
bmp\biSize=SizeOf(BITMAPINFOHEADER)
bmp\biWidth=Width
bmp\biHeight=Height
bmp\biPlanes=1
bmp\biBitCount=BitColor
bmp\biCompression=#BI_RGB
hBitmap=CreateDIBSection_(DC,bmp,#DIB_RGB_COLORS,@*ptr,0,0)
DeleteDC_(DC)
If GetObjectType_(hBitmap)=0:ProcedureReturn 0:EndIf
*ImgPtr.PB_StructureImage=IMAGE_GetOrAllocImageSpace(Number)
If *ImgPtr=0:ProcedureReturn 0:EndIf
If GetObjectType_(*ImgPtr\Bitmap):DeleteObject_(*ImgPtr\Bitmap):EndIf
GetObject_(hBitmap,SizeOf(BITMAP),BmpInf.BITMAP)
*ImgPtr\Bitmap=hBitmap
*ImgPtr\Width=BmpInf\bmWidth
*ImgPtr\Height=BmpInf\bmHeight
*ImgPtr\Depth=BmpInf\bmBitsPixel
*ImgPtr\ColorArray=0
If Number=#PB_Any
UseImage(*ImgPtr.PB_StructureImage)
ProcedureReturn *ImgPtr.PB_StructureImage
Else
UseImage(Number)
ProcedureReturn hBitmap
EndIf
EndProcedure
CreateImage_Test(1,8192,8192,24)
UsePNGImageEncoder()
SaveImage(1,"c:\test.png",#PB_ImagePlugin_PNG)
FreeImage(1)
If OpenWindow(0,0,0,300,300,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"ImageGadget") And CreateGadgetList(WindowID(0))
test=CreateImage_Test(#PB_Any,200,200,32)
If IsImage(test)
UseImage(test)
StartDrawing(ImageOutput())
For c=0 To 24
Circle(Random(400),Random(300),50,Random($FFFFFF))
Next
StopDrawing()
ImageGadget(1,10,10,200,200,ImageID(),#PB_Image_Border)
EndIf
EndIf
Exit=0
Size=3000
Repeat
If CreateImage_Test(1,Size,Size,32)
FreeImage(1)
Size+10
Debug Size
Else
Debug getlasterror_()
Exit=#True
EndIf
Until Exit
Debug "Erstellt bis: "+Str(Size)
Debug Str(Size*Size*4/1024/1204)+"MB" ;32Bit Color
Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
Wäre schön wenn es mal jemand testet.
Verfasst: 07.07.2005 18:47
von Ynnus
Naja, ganz ausreizen tut's noch nicht. Ich komme bis 1022 MB, mittels Test hab ich aber ca 2GB Speicher frei zum Bereitstellen.
Jedenfalls geht's jetzt etwas größer.
Trotzdem, warum verwendest du überhaupt immer solche komischen Funktionen zum Erstellen eines Images? Brauch man doch alles nicht. Es reicht ein Pointer zu dem Byte-Array und einer zu dem Infoheader des Bitmap (lässt sich ganz easy on-the-fly erstellen, auch ohne geladene Datei).
Dann kann man diese Byte mit der genannten Funktion anzeigen lassen, in eine Datei abspeichern, was will man mehr damit machen?
Ich schau mal, ob ich die wesentlichen Funktionen in PB convertiert bekomme...
Verfasst: 07.07.2005 19:20
von Zaphod
@computerkranker:
sorry, bin die diskussion nur von sprite gewohnt, kam irgendwie immer mal wieder... war also nur ein reflex

Verfasst: 07.07.2005 21:52
von computerkranker
@Sunny:
Wenn möglich wollte ich schon die normalen PB-Befehl benutzen. Was ja mit obigen Beispiel möglich ist. Es wäre nur noch eine Ersatzfunktion für LoadImage und CatchImage nötig.
Wenn Du natürlich ein Code(in PB) hast der alles mit DIB macht und das laden von JPG,PNG, TIFF unterstützt und Speichern natürlich auch. Der vor allem auch so was wie CatchImage hat. Na dann immer her.
Verfasst: 08.07.2005 09:01
von Jason
computerkranker hat geschrieben:@Sunny:
Wenn möglich wollte ich schon die normalen PB-Befehl benutzen. Was ja mit obigen Beispiel möglich ist. Es wäre nur noch eine Ersatzfunktion für LoadImage und CatchImage nötig.
Wenn Du natürlich ein Code(in PB) hast der alles mit DIB macht und das laden von JPG,PNG, TIFF unterstützt und Speichern natürlich auch. Der vor allem auch so was wie CatchImage hat. Na dann immer her.
Ich bin der Ansicht das PB da gefixt werden muss. Wofür sind die Befehle sonst da. Wenn sich solche Beschränkungen häufen würden, würde PB schlicht uninteressant.

Verfasst: 16.07.2005 20:02
von Andre
Habe Fred auch nochmal auf diesen Thread hingewiesen, insbesondere auch auf die neuen Beispiel-Codes in C bzw. PB.