Umfrage zur maximalen Imagegröße

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
computerkranker
Beiträge: 66
Registriert: 12.10.2004 21:21

Beitrag 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.
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag 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.
Benutzeravatar
computerkranker
Beiträge: 66
Registriert: 12.10.2004 21:21

Beitrag 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.
Benutzeravatar
computerkranker
Beiträge: 66
Registriert: 12.10.2004 21:21

Beitrag 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.
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag 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...
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

@computerkranker:

sorry, bin die diskussion nur von sprite gewohnt, kam irgendwie immer mal wieder... war also nur ein reflex ;)
Benutzeravatar
computerkranker
Beiträge: 66
Registriert: 12.10.2004 21:21

Beitrag 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.
Benutzeravatar
Jason
Beiträge: 123
Registriert: 06.01.2005 17:47

Beitrag 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. :|
Der Rest ist Schweigen!
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag von Andre »

Habe Fred auch nochmal auf diesen Thread hingewiesen, insbesondere auch auf die neuen Beispiel-Codes in C bzw. PB.
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Antworten