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.

:bounce:

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.