Fuente/ Codesnippets | | | | Jörg Sellmeyer | Yo ahora via Ole (Dank a Andreas Miethe - siempre otra vez) una funktionierendes Handle para Bitmaps (auch gif, ico y diverse otro Formate) ermitteln puede, el entonces bastante normal en una Bitmapstatic adecuado voluntad kann. Mit el Ermittlung el Größe kann Yo mich en el Fall todavía no bastante anfreunden. Wer como una Concepto ha - en el Code Es el Punto markiert.
Hier jedenfalls primero el Code, en una gültiges Handle auch para große Bilder a obtener. Wenn uno lo en el Programa häufiger verwendet, es sicher sinnvoller, el Init-Rutina sólo una vez al Anfang aufzurufen, aber así funktioniert lo ya veces klaglos. Bitte veces con Archivos größer como 5100 Pixeln testen. Aktuell Yo lo sólo jpg y gif probiert. Icos son tan größenmäßig no el problema.
$H windows.ph
'Konstanten
DEF &Picture_Release 8
DEF &Picture_GetHandle 12
DEF &Picture_GetType 20
DEF &Picture_Get_Width 24
DEF &Picture_Get_Height 28
DEF &Picture_Render 32
DEF &Picture_Select 44
'Globale Variables
DECLARE IID_IPicture#
DECLARE PData#
DECLARE HMEM&
Declarar OlePic#
Class OleImage = OleImage@,\
Ole_Init@,\
Ole_Free@,\
Ole_LoadImage@,\
Ole_GetType@,\
Ole_GetHandle@,\
Ole_FreeImage@,\
OLE32&,\
OLEPro32&,\
PictureObject&,\
hPic&,\
PicFormat&,\
Width&,\
Height&,\
GetSize@,\
Destroy@
Proc OleImage.OleImage
Parámetros File$
.Ole_Init()
.PictureObject& = .Ole_LoadImage(File$)
.PicFormat& = .Ole_GetType(.PictureObject&)
.hPic& = .Ole_GetHandle()
Imprimir .PictureObject&,.PicFormat&,.hpic&
ENDPROC
Proc OleImage.Ole_Init
.OLE32& = UseDll("OLE32")
.OLEPRO32& = UseDll("OLEPRO32")
Externo("OLE32","OleInitialize",0)
Dim IID_IPicture#,16
Largo IID_IPicture#,0 = $7BF80980
Word IID_IPicture#,4 = $BF32
Word IID_IPicture#,6 = $101A
Byte IID_IPicture#,8 = $8B
Byte IID_IPicture#,9 = $BB
Byte IID_IPicture#,10 = $00
Byte IID_IPicture#,11 = $AA
Byte IID_IPicture#,12 = $00
Byte IID_IPicture#,13 = $30
Byte IID_IPicture#,14 = $0C
Byte IID_IPicture#,15 = $AB
ENDPROC
Proc OleImage.Ole_Free
~GlobalFree(Hmem&)
Externo("OLE32","OleUninitialize")
FreeDll .OLE32&
FreeDll .OLEPRO32&
DISPOSE IID_IPicture#
ENDPROC
Proc OleImage.Ole_LoadImage
Declarar MemPointer&,PStream&,PictureObject&,PSize&
Parámetros Picture$
'------------------------
Conjunto("Filemode", 0)
PSIZE& = Filesize(Picture$)
Dim PData#,PSIZE&
BlockRead(Picture$,PData#,0,PSIZE&)'Daten en Bereichsvariable einlesen
'------------------------
~GlobalFree(Hmem&)
HMem& = ~GlobalAlloc($022,PSize&)'Speicher reservieren
Mempointer& = ~GlobalLock(Hmem&)'Pointer en Speicher
~RtlMoveMemory(MemPointer&,PData#,PSize&)'Bereichsvariable en Speicher schieben
DISPOSE PData#'Bereichsvariable liberación
~GlobalUnlock(HMem&)'Speicher para Gebrauch liberación
Externo("Ole32","CreateStreamOnHGlobal",Hmem&,1,addr(PStream&))'Stream-Pointer redactar
Externo("OlePro32","OleLoadPicture",PStream&,PSIZE&,0,IID_IPicture#,ADDR(PictureObject&))'Pointer fuer Pictureobject
'------------------------
Case PictureObject& > 0 : Volver PictureObject&
Case PictureObject& = 0 : Volver 0
ENDPROC
Proc OleImage.Ole_GetType
Declarar Command&,PicFormat&
Command& = Largo(.PictureObject&,0)
Call(@Largo(Command&,&Picture_GetType),.PictureObject&,addr(PicFormat&))
Volver PicFormat&
ENDPROC
Proc OleImage.GetSize
Parámetros DC&
Declarar Command&,w&,h&,xpixels&,ypixels&
Command& = Largo(.PictureObject&,0)
'hier se el Bildschirmauflösung pro Zoll abgefragt - en me 96x96.
'Aunque weiß Yo no, welche Función en welcher dll como angesprochen se.
Call(@Largo(Command&,&Picture_Get_Width),.PictureObject&,addr(w&))
Call(@Largo(Command&,&Picture_Get_Height),.PictureObject&,addr(h&))
'el Größe la ventana se ermittelt
xpixels& = ~GetDeviceCaps(DC&, 88)
ypixels& = ~GetDeviceCaps(DC&, 90)
'Umrechnung el Bildschirmauflösung en el Fenstergröße.
'Yo allerdings ni idea, como el Valor 2540 zustande kommt.
.Width& = Round((w&*xpixels&)/2540,0)
.Height& = Round((h&*ypixels&)/2540,0)
ENDPROC
Proc OleImage.Ole_GetHandle
Declarar Command&,PicHandle&
Command& = Largo(.PictureObject&,0)
Call(@Largo(Command&,&Picture_GetHandle),.PictureObject&,addr(PicHandle&))
Volver PicHandle&
ENDPROC
Proc OleImage.Ole_FreeImage
Parámetros PictureObject&
Declarar Command&
Command& = Largo(PictureObject&,0)
Call(@Largo(Command&,&Picture_Release),PictureObject&)
ENDPROC
Proc OleImage.Destroy
DeleteObject .hPic&,.PictureObject&
.Ole_Free()
ENDPROC
Declarar hbtn&,Bild$,hFont&,Anzeige&,OleAnzeige&,TestHandle&
Mensajes del usuario $10
~SetWindowLong(%hwnd,~GWL_STYLE,(~GetWindowLong(%hwnd,~GWL_STYLE) | $300000))
Ventana %maxx,%maxy
Título de la ventana "Handle por OLE"
hFont& = Crear("Font","Western ",14,0,0,0,0)
SetDialogFont hFont&
hbtn& = Crear("Button",%hwnd,"Bild laden",%maxx-80,40,60,24)
Sinestar encargado %key = 27'ESC final el Programa
If GetText $(%hwnd) <> "Handle por OLE"
WaitInput 4000
Título de la ventana "Handle por OLE"
ShowWindow(hbtn&,5)
EndIf
WaitInput
Case %uMessage = $10:Romper
If Clicked(hbtn&)
Bild$ = LoadFile$("ÖFFNE","alle unterstützten Formate|*.dib;*.bmp;*.rle;*.jpe;*.jpeg;*.jpg;*.gif;*.ico;*.cur;*.emf;*.wmf|\
Mapa de bits (bmp,rle,dib)|*.bmp;*.rle;*.dib|Jpeg (jpg,jpe,jpeg)|*.jpg;*.jpe;*.jpeg|Gif (gif)|*.gif|\
Enhanced Metafile (emf)|*.emf|Metafile (wmf)|*.wmf|Icons (Ico)|*.ico|Cursor (cur)|*.cur")
If Bild$ > ""
TestHandle& = Crear("HPIC",-1,Bild$)
'en großen Bildern es hier el Ergebnis 0
Título de la ventana Str$(TestHandle&) + " En muy großen Bildern es el Ergebnis hier 0"
DeleteObject TestHandle&
If SizeOf(OlePic#)
DestroyWindow(OleAnzeige&)
OlePic#.Destroy()
Disponer OlePic#
EndIf
OlePic# = New(OleImage,Bild$)
If Anzeige&
DestroyWindow(Anzeige&)
waitinput
Cls
EndIf
With OlePic#
'el Handleermittlung via Ole bringt una verwertbares Handle:
OlePic#.GetSize(%hdc2)
Imprimir .Width&,.Height&,"Typ:",.Ole_GetType()
If .PicFormat& = 1
OleAnzeige& = Crear("Mapa de bits",%hwnd,.hPic&,0,0)
.GetSize(%hdc2)
Imprimir .Width&,OlePic#.Height&
ElseIf .PicFormat& = 3
Imprimir "Icon es Typ:",.PicFormat&,"und kann más rápido con Profanmitteln adecuado voluntad."
EndIf
EndWith
EndIf
EndIf
Wend
If SizeOf(OlePic#)
OlePic#.Destroy()
Disponer OlePic#
EndIf
DeleteObject hFont&
End
Basierend en diesem Code [...] de Andreas Methe |
| | | Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 03.06.2020 ▲ |
| |
| | Matthias Arlt | En me genügt una ' sleep 100 ' antes el ' with OlePic# '. Offenbar braucht el vorhergehende Aktion unos pocos ms Tiempo. En el ms es todavía Luft después de unten. Möglicherweise es el systemabhängig. El Bildgröße juega como wohl ningún papel. |
| | | WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia | 03.06.2020 ▲ |
| |
| | Jörg Sellmeyer | Eigentlich erstaunlich, dass lo entonces funktioniert, como Yo como schlicht una Fehler gemacht habe. Lo muss heißen: Case Anzeige&: DestroyWindow(Anzeige&) Gracias fürs Testen. Ist ahora korrigiert. |
| | | Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 04.06.2020 ▲ |
| |
| | Michael W. | 2,54 es el Umrechnungswert inch después de cm
PictureObject es una StreamObjekt el como producido se. Und bastante offensichtlich erbt dieses StreamObjekt una Objeto, dessen Métodos entonces para Abfragen el Größe y weiterer Dinge verwendet voluntad puede.
Como wir en unseren Objekten no Zeiger y kein THIS haben, puede wir esta Objetos desafortunadamente en XProfan no como einfache Objetos handhaben.
Crear("HPIC": Hast Usted veces geschaut, welche Dateitypen como el Null erzeugen? Offensichtlich Es el Función no así vielseitig como OLE.
El Función Crear("Mapa de bits",... se 2x hintereinander aufgerufen.
--- Apéndice: Tuve gehofft, el .Ole_GetType algo sinnvolles liefert. Aber Yo erhielt con allem una 1 geliefert. .ico/.cur führt para Choque, obwohl lo en el ladbaren Typen aufgeführt es.
Hier el Test-Source:
$H windows.ph
'Konstanten DEF &Picture_Release 8 DEF &Picture_GetHandle 12 DEF &Picture_GetType 20 DEF &Picture_Get_Width 24 DEF &Picture_Get_Height 28 DEF &Picture_Render 32 DEF &Picture_Select 44
'Globale Variables 'DECLARE OLE32&,OLEPRO32& DECLARE IID_IPicture# DECLARE PData# DECLARE HMEM& Declarar OlePic#
Class OleImage = OleImage@,\ Ole_Init@,\ Ole_Free@,\ Ole_LoadImage@,\ Ole_GetType@,\ Ole_GetHandle@,\ Ole_FreeImage@,\ OLE32&,\ OLEPro32&,\ PictureObject&,\ hPic&,\ PicFormat&,\ Width&,\ Height&,\ GetSize@,\ Destroy@
Proc OleImage.OleImage Parámetros File$ .Ole_Init() .PictureObject& = .Ole_LoadImage(File$) .PicFormat& = .Ole_GetType(.PictureObject&) .hPic& = .Ole_GetHandle() ENDPROC
Proc OleImage.Ole_Init .OLE32& = UseDll("OLE32") .OLEPRO32& = UseDll("OLEPRO32") Externo("OLE32","OleInitialize",0) Dim IID_IPicture#,16 Largo IID_IPicture#,0 = $7BF80980 Word IID_IPicture#,4 = $BF32 Word IID_IPicture#,6 = $101A Byte IID_IPicture#,8 = $8B Byte IID_IPicture#,9 = $BB Byte IID_IPicture#,10 = $00 Byte IID_IPicture#,11 = $AA Byte IID_IPicture#,12 = $00 Byte IID_IPicture#,13 = $30 Byte IID_IPicture#,14 = $0C Byte IID_IPicture#,15 = $AB ENDPROC
Proc OleImage.Ole_Free ~GlobalFree(Hmem&) Externo("OLE32","OleUninitialize") FreeDll .OLE32& FreeDll .OLEPRO32& DISPOSE IID_IPicture# ENDPROC
Proc OleImage.Ole_LoadImage Declarar MemPointer&,PStream&,PictureObject&,PSize& Parámetros Picture$ '------------------------ Conjunto("Filemode", 0) PSIZE& = Filesize(Picture$) Dim PData#,PSIZE& BlockRead(Picture$,PData#,0,PSIZE&)'Daten en Bereichsvariable einlesen '------------------------ ~GlobalFree(Hmem&) HMem& = ~GlobalAlloc($022,PSize&)'Speicher reservieren Mempointer& = ~GlobalLock(Hmem&)'Pointer en Speicher ~RtlMoveMemory(MemPointer&,PData#,PSize&)'Bereichsvariable en Speicher schieben DISPOSE PData#'Bereichsvariable liberación ~GlobalUnlock(HMem&)'Speicher para Gebrauch liberación Externo("Ole32","CreateStreamOnHGlobal",Hmem&,1,addr(PStream&))'Stream-Pointer redactar Externo("OlePro32","OleLoadPicture",PStream&,PSIZE&,0,IID_IPicture#,ADDR(PictureObject&))'Pointer fuer Pictureobject '------------------------ Case PictureObject& > 0 : Volver PictureObject& Case PictureObject& = 0 : Volver 0 ENDPROC
Proc OleImage.Ole_GetType Declarar Command&,PicFormat& Command& = Largo(.PictureObject&,0) Call(@Largo(Command&,&Picture_GetType),.PictureObject&,addr(PicFormat&)) Volver PicFormat& ENDPROC
Proc OleImage.GetSize 'hier tauchen para mich unos pocos ungelöste Fragen en. Parámetros DC& Declarar Command&,w&,h&,xpixels&,ypixels& Command& = Largo(.PictureObject&,0) 'hier se el Bildschirmauflösung pro Zoll abgefragt - en me 96x96. 'Aunque weiß Yo no, welche Función en welcher dll como angesprochen se. Call(@Largo(Command&,&Picture_Get_Width),.PictureObject&,addr(w&)) Call(@Largo(Command&,&Picture_Get_Height),.PictureObject&,addr(h&)) 'el Größe la ventana se ermittelt xpixels& = ~GetDeviceCaps(DC&, 88) ypixels& = ~GetDeviceCaps(DC&, 90) 'Umrechnung el Bildschirmauflösung en el Fenstergröße. 'Yo allerdings ni idea, como el Valor 2540 zustande kommt. .Width& = Round((w&*xpixels&)/2540,0) .Height& = Round((h&*ypixels&)/2540,0) ENDPROC
Proc OleImage.Ole_GetHandle Declarar Command&,PicHandle& Command& = Largo(.PictureObject&,0) Call(@Largo(Command&,&Picture_GetHandle),.PictureObject&,addr(PicHandle&)) Volver PicHandle& ENDPROC
Proc OleImage.Ole_FreeImage Parámetros PictureObject& Declarar Command& Command& = Largo(PictureObject&,0) Call(@Largo(Command&,&Picture_Release),PictureObject&) ENDPROC
Proc OleImage.Destroy DeleteObject .hPic&,.PictureObject& .Ole_Free() ENDPROC
Declarar hbtn&,Bild$,hFont&,Anzeige&,TestHandle& Mensajes del usuario $10 Cls ShowMax hFont& = Crear("Font","Western ",14,0,0,0,0) SetDialogFont hFont& hbtn& = Crear("Button",%hwnd,"Bild invitar",%maxx-70,40,60,24)
'### zugefuegt ### Declarar szTXT&, typ1TXT&, typ2TXT&, typ2$ szTXT& = Crear("Texto",%hwnd,"1000x1000",%maxx-70,40+30,60,24) typ1TXT& = Crear("Texto",%hwnd,"&bildtyp",%maxx-70,40+30+30,60,24) typ2TXT& = Crear("Texto",%hwnd,"$bildtyp",%maxx-70,40+30+30+30,60,24) '###
Sinestar encargado %key = 27 'ESC final el Programa WaitInput Case %uMessage = $10 : Romper
If Clicked(hbtn&) Bild$ = LoadFile$("ÖFFNE","todos unterstützten Formate|*.dib;*.bmp;*.rle;*.jpe;*.jpeg;*.jpg;*.gif;*.ico;*.cur;*.emf;*.wmf|\ Mapa de bits (bmp,rle,dib)|*.bmp;*.rle;*.dib|Jpeg (jpg,jpe,jpeg)|*.jpg;*.jpe;*.jpeg|Gif (gif)|*.gif|\ Enhanced Metafile (emf)|*.emf|Metafile (wmf)|*.wmf|Icons (Ico)|*.ico|Cursor (cur)|*.cur")
If Bild$ > "" '### zugefuegt ### typ2$ = Right$(Bild$,6) '6 wegen .tiff, .jpeg typ2$ = Substr$(typ2$, 2, ".") '### TestHandle& = Crear("hPic",-1,Bild$) 'en muy großen Bildern es hier el Ergebnis 0 Título de la ventana Str$(TestHandle&) + " Handle. En muy großen Bildern es el Ergebnis hier 0" DeleteObject TestHandle&
If SizeOf(OlePic#) OlePic#.Destroy() Disponer OlePic# EndIf
OlePic# = New(OleImage,Bild$) Case Anzeige&: DestroyWindow(Anzeige&) With OlePic# '### hier war 2. Crear("Mapa de bits" 'el Handleermittlung via Ole bringt una verwertbares Handle: Anzeige& = Crear("Mapa de bits",%hwnd,.hPic&,0,0) OlePic#.GetSize(%hdc2) '### zugefuegt ### 'Imprimir .Width&,.Height& SetText szTXT&, Trim$(Str$(.Width&) + "x" + Str$(.Height&)) SetText typ1TXT&, Trim$(Str$(.PicFormat&)) SetText typ2TXT&, Trim$(typ2$) '### EndWith EndIf EndIf Wend
If SizeOf(OlePic#) OlePic#.Destroy() Disponer OlePic# EndIf DeleteObject hFont&
End
|
| | | System: Windows 8/10, XProfan X4 Programmieren, das spannendste Detektivspiel der Welt. | 05.06.2020 ▲ |
| |
| | Jörg Sellmeyer | Um Ico y otro Formate es me hier nada. Yo versuche, una Ansatz a liefern, cómo große Bilder (el heutzutage con cada Handy en el Megapixelbereich gemacht voluntad) con Profano Mostrar kann. El pequeño Formate trabajo sí bien con (Crear(...)). Das una zuviel me está beim letzten Kontrollgang durchgerutscht. - es aber auch unerheblich.
Entscheidend es una Test con Bildern (jpg) con mindestens 3000 x 2000 Pixeln más o menos. In el Zona bekommt uno con Crear(...) eben kein gültiges Handle mehr, pero sólo todavía Null y kann dementsprechend auch weder Mostrar, todavía irgendwelche Werte auslesen. Wobei Profano ya en viel kleineren Bildern kneift. El Grenze liegt en etwa 1 Mio Pixeln gesamt. Was eben heutzutage una Witz es.
Mit Ole va el aber. Das korrekte Handle lässt se en una profaneigenen Crear("Mapa de bits",...) Mostrar y el Maße dejar se entonces eben auch (si auch umständlich) ermitteln. Yo oben veces a la korrigierten Code reingesetzt. Auf el Inch-Umrechnung hätte Yo auch kommen puede, como ehemaliger Tischler - Gracias para el Referencia. |
| | | Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 05.06.2020 ▲ |
| |
| | Michael W. | 2592x1944 2448x3264 (de el weiß Todavía, el ha 9 MB) se en me alles con negativem handle adecuado.
Das Scrollen puede ser con un scrollbaren Hintergrund erreichen. Como gibts irgendwie "scrollable Gadget" más o menos.
Der Testteil kann fuera, porque Ole el sí en el Griff ha. |
| | | System: Windows 8/10, XProfan X4 Programmieren, das spannendste Detektivspiel der Welt. | 05.06.2020 ▲ |
| |
| | Matthias Arlt | Kann Yo sólo bestätigen... Mehrfachtest con Bildern größer como ca. 4000x3000 problemlos y durchgängig con negativem Hdl. |
| | | WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia | 05.06.2020 ▲ |
| |
| | Jörg Sellmeyer | Das negative hdl es no ungewöhnlich. Gibt lo auch en kleineren Bildern con profaneigenen Mitteln siempre veces otra vez. Aber schön, dass lo anscheinend problemlos klappt.
Yo voluntad el todavía como Objeto fertig hacer. Lieber wäre me aber, si Roland el nächste Profanversion así aufbohrt, dass entonces auch große Bilder así ladbar son.
Un solche Función como externe Möglichkeit führt sólo a doppelten Aktionen, si uno feststellt, dass Profano kein Handel erzeugen kann oder macht en el Principio el Crear("HPIC",...) Función überflüssig, qué en efecto no Sinn el Sache es. |
| | | | |
| | Matthias Arlt | Hm...en me va el con eben esta großen Bildern auch en reinem Profano. Grad veces rápidamente bajo 11.2 getestet (otra vez con größer 4000x3000)
declarar btn&,pic$,hPic&,hBmp&
window 0,0-%maxx,(%maxy-30)
btn&=create("BUTTON",%hwnd,"Bild...",20,20,60,22)
mientras que 1
waitinput
if clicked(btn&)
pic$=LoadFile$("Bild invitar...","*.*")
if FileExists(pic$)
caso hPic& : deleteobject hPic&
caso hBmp& : destroywindow(hBmp&)
hPic&=Crear("HPIC",-1,pic$)
hBmp&=Crear("Mapa de bits",%hwnd,hPic&,0,0)
endif
endif
wend
caso hPic& : deleteobject hPic&
Oder Yo tener evtl. el problema mißverstanden !? |
| | | WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia | 05.06.2020 ▲ |
| |
| | Jörg Sellmeyer | Probier veces que aquí: [...] |
| | | | |
| | Matthias Arlt | Hab Yo ahora probiert. Interessant es hier sí sólo el größte Auflösung. Tatsächlich steigt Profano esta de. Verkleinere Yo nun dieses Bild con IrfanView en ca. 90 Prozent su Größe, entonces klappt el auch otra vez con Profano. Demnach Es el verarbeitbare Grenze para Profano en rund 8000x8000.
Apéndice: Yo bin una vez más el ungekehrten Weg gegangen y tener uno meiner eigenen Bilder en encima 8000 vergrößert. Auch como steigt Profano entonces de. Also liegt hay wohl el máximo Machbare.
Apéndice 2: Und porque Yo el nun genau wissen quería, tener Yo mich veces por MCLS ans Limit el Speicherbitmap herangetastet. Maximum war entonces en 7905x7905. |
| | | WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia | 06.06.2020 ▲ |
| |
| | Michael W. | also una 64k-Grenze?
Yo habe el Bild veces geladen y getestet. Man sieht el Kapverdischen Inseln y Gibraltar. Der Rest vom gigantischen Bild es no a sehen. Aber abstürzen voluntad el Programa no. Kann lo ser, el ihr simplemente sólo a wenig Speicher en el Rechner habt?
8460x8900 Puedo me eigentlich no vorstellen que aquí el Bildschirmgröße una Papel juega. Mein Samsung Bildschirm schafft 1920x1080 en el jetzigen Einstellung. |
| | | System: Windows 8/10, XProfan X4 Programmieren, das spannendste Detektivspiel der Welt. | 10.06.2020 ▲ |
| |
|
Zum QuelltextThemeninformationenDieses Thema ha 4 subscriber: |