Français
Source/ Codesnippets

Handle très grand Bilder Ole

 
- page 1 -



Jörg
Sellmeyer
je hab maintenant via Ole (Dank à Andreas Miethe - toujours wieder) un funktionierendes Handle pour Bitmaps (aussi gif, ico et diverse autre Formate) ermitteln peut, cela ensuite entier normal sur einem Bitmapstatic angezeigt volonté peux. avec qui Ermittlung qui Taille peux je mich dans dem le cas encore pas entier anfreunden. qui là une concept hat - im Code ist qui Stelle markiert.

ici jedenfalls erstmal qui Code, um un gültiges Handle aussi pour grand Bilder trop conservé.
si on es im Programme häufiger verwendet, ist es sûrement sinnvoller, qui Init-Routine seulement einmal am Anfang aufzurufen, mais so funktioniert es déjà la fois klaglos.
s'il te plaît la fois avec Fichiers größer comme 5100 Pixeln testen. Aktuell habe je es seulement avec jpg et gif probiert. Icos sommes oui größenmäßig pas cela Problem.
 $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 Variablen
DECLARE IID_IPicture#
DECLARE PData#
DECLARE HMEM&
Déclarer 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

    Paramètres File$
    .Ole_Init()
    .PictureObject& = .Ole_LoadImage(File$)
    .PicFormat& = .Ole_GetType(.PictureObject&)
    .hPic& = .Ole_GetHandle()
    Imprimer .PictureObject&,.PicFormat&,.hpic&

ENDPROC

Proc OleImage.Ole_Init

    .OLE32& = UseDll("OLE32")
    .OLEPRO32& = UseDll("OLEPRO32")
    Externe("OLE32","OleInitialize",0)
    Faible IID_IPicture#,16
    Long 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&)
    Externe("OLE32","OleUninitialize")
    FreeDll .OLE32&
    FreeDll .OLEPRO32&
    DISPOSE IID_IPicture#

ENDPROC

Proc OleImage.Ole_LoadImage

    Déclarer MemPointer&,PStream&,PictureObject&,PSize&
    Paramètres Picture$
    '------------------------
    Set("Filemode", 0)
    PSIZE& = Filesize(Picture$)
    Faible PData#,PSIZE&
    BlockRead(Picture$,PData#,0,PSIZE&)'données dans Bereichsvariable einlesen
    '------------------------
    ~GlobalFree(Hmem&)
    HMem& = ~GlobalAlloc($022,PSize&)'grenier reservieren
    Mempointer& = ~GlobalLock(Hmem&)'Pointer sur grenier
    ~RtlMoveMemory(MemPointer&,PData#,PSize&)'Bereichsvariable dans grenier schieben
    DISPOSE PData#'Bereichsvariable freigeben
    ~GlobalUnlock(HMem&)'grenier zum Gebrauch freigeben
    Externe("Ole32","CreateStreamOnHGlobal",Hmem&,1,addr(PStream&))'Stream-Pointer erstellen
    Externe("OlePro32","OleLoadPicture",PStream&,PSIZE&,0,IID_IPicture#,ADDR(PictureObject&))'Pointer pour Pictureobject
    '------------------------
    Cas PictureObject& > 0 : Retour PictureObject&
    Cas PictureObject& = 0 : Retour 0

ENDPROC

Proc OleImage.Ole_GetType

    Déclarer Command&,PicFormat&
    Command& = Long(.PictureObject&,0)
    Call(@Long(Command&,&Picture_GetType),.PictureObject&,addr(PicFormat&))
    Retour PicFormat&

ENDPROC

Proc OleImage.GetSize

    Paramètres DC&
    Déclarer Command&,w&,h&,xpixels&,ypixels&
    Command& = Long(.PictureObject&,0)
    'ici wird qui Bildschirmauflösung pro douane abgefragt - chez mir 96x96.
    'Allerdings sais je pas, quelle Funktion dans quel dll là angesprochen wird.
    Call(@Long(Command&,&Picture_Get_Width),.PictureObject&,addr(w&))
    Call(@Long(Command&,&Picture_Get_Height),.PictureObject&,addr(h&))
    'qui Taille des Fensters wird ermittelt
    xpixels& = ~GetDeviceCaps(DC&, 88)
    ypixels& = ~GetDeviceCaps(DC&, 90)
    'change qui Bildschirmauflösung sur qui Fenstergröße.
    'je hab allerdings je n'en sais rien, comment qui Wert 2540 zustande venez.
    .Width&  = Round((w&*xpixels&)/2540,0)
    .Height& = Round((h&*ypixels&)/2540,0)

ENDPROC

Proc OleImage.Ole_GetHandle

    Déclarer Command&,PicHandle&
    Command& = Long(.PictureObject&,0)
    Call(@Long(Command&,&Picture_GetHandle),.PictureObject&,addr(PicHandle&))
    Retour PicHandle&

ENDPROC

Proc OleImage.Ole_FreeImage

    Paramètres PictureObject&
    Déclarer Command&
    Command& = Long(PictureObject&,0)
    Call(@Long(Command&,&Picture_Release),PictureObject&)

ENDPROC

Proc OleImage.Destroy

    DeleteObject .hPic&,.PictureObject&
    .Ole_Free()

ENDPROC

Déclarer hbtn&,Bild$,hFont&,Anzeige&,OleAnzeige&,TestHandle&
Utilisateur Messages $10
~SetWindowLong(%hwnd,~GWL_STYLE,(~GetWindowLong(%hwnd,~GWL_STYLE) | $300000))
Fenêtre %maxx,%maxy
Titre de la fenêtre "Handle per OLE"
hFont& = Créer("Font","Western ",14,0,0,0,0)
SetDialogFont hFont&
hbtn& = Créer("Button",%hwnd,"Bild laden",%maxx-80,40,60,24)

WhileNot %clé = 27'ESC finissez cela Programme

    Si GetText $(%hwnd) <> "Handle per OLE"

        WaitInput 4000
        Titre de la fenêtre "Handle per OLE"
        ShowWindow(hbtn&,5)

    EndIf

    WaitInput
    Cas %uMessage = $10:Pause

    Si Clicked(hbtn&)

        Bild$ = LoadFile$("ÖFFNE","alle unterstützten Formate|*.dib;*.bmp;*.rle;*.jpe;*.jpeg;*.jpg;*.gif;*.ico;*.cur;*.emf;*.wmf|\
        Bitmap (bmp,rle,dib)|*.bmp;*.rle;*.dib|Jpeg (jpg,jpe,jpeg)|*.jpg;*.jpe;*.jpeg|Gif (gif)|*.gif|\
        Enhanced Metafile (emf)|*.emf|Metafile (wmf)|*.wmf|Icônes (Ico)|*.ico|Cursor (cur)|*.cur")

        Si Bild$ > »

            TestHandle& = Créer(«PCSI»,-1,Bild$)
            'chez grand Bildern ist ici cela Ergebnis 0
            Titre de la fenêtre Str$(TestHandle&) + " chez très grand Bildern ist cela Ergebnis ici 0"
            DeleteObject TestHandle&

            Si SizeOf(OlePic#)

                DestroyWindow(OleAnzeige&)
                OlePic#.Destroy()
                Dispose OlePic#

            EndIf

            OlePic# = New(OleImage,Bild$)

            Si Anzeige&

                DestroyWindow(Anzeige&)
                waitinput
                Cls

            EndIf

            With OlePic#

                'qui Handleermittlung via Ole bringt un verwertbares Handle:
                OlePic#.GetSize(%hdc2)
                Imprimer .Width&,.Height&,"Typ:",.Ole_GetType()

                Si .PicFormat& = 1

                    OleAnzeige& = Créer("Bitmap",%hwnd,.hPic&,0,0)
                    .GetSize(%hdc2)
                    Imprimer .Width&,OlePic#.Height&

                ElseIf .PicFormat& = 3

                    Imprimer "Icon ist Typ:",.PicFormat&,"und peux plus rapide avec Profanmitteln angezeigt volonté."

                EndIf

            EndWith

        EndIf

    EndIf

Wend

Si SizeOf(OlePic#)

    OlePic#.Destroy()
    Dispose OlePic#

EndIf

DeleteObject hFont&
Fin

Basierend sur diesem Code  [...]  de Andreas Methe
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
03.06.2020  
 



 
- page 2 -



RGH
justement getestet: avec Matthias' Code (reines XProfan) konnte je mon größten Bilder (16 MPixel, Dateigröße sur 6 MB) problemlos magasin. Größere Bilder habe je pas. je benutze mon aktuelle XProfan-Version.

Nachtrag: et aussi cela dessus verlinkte afrique-Bild pouvoir dans höchster Auflösung (75 MPixel) aucun Probleme.

Salut
Roland
 
Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4
11.06.2020  
 




Matthias
Arlt
je hatte avec 11.2 getestet et Jörg vmtl. avec X4. ensuite sembler là wohl encore autre Faktoren une rôle trop spielen...seulement quelle? Mir était cela oui aussi encore nie aufgefallen, là je solch grand Bilder plan aussi pas habe.
ah oui...si FreeProfan et OLE sich pas so droite lieben...mon "schlankere" API-variante venez oui entier sans OLE aus.
 
WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia
11.06.2020  
 




Jörg
Sellmeyer
RGH (11.06.2020)
j'ai justement la fois nachgeschaut: qui XProfan-Befehle et -Funktionen, qui Bilder aus Fichiers magasin (MLoadBmp, DrawPic, DrawSizedPic et Créer(«PCSI»,...)), nutzen une OLE-Routine, qui à Andreas' Code angelehnt ist. ici sollte es aucun Probleme avec grand Bitmaps donner. je muss cela la fois näher überprüfen.

(cela gilt pas pour FreeProfan, là je Free Pascal encore pas avec OLE-Objekten verheiraten konnte.)

Salut
Roland


RGH
Nachtrag: et aussi cela dessus verlinkte afrique-Bild pouvoir dans höchster Auflösung (75 MPixel) aucun Probleme.


là frage je mich mais, pourquoi cela chez Je ne funktioniert. je hab zwar encore XP avec 2GB Ram mais avec meiner variante de Andreas' Code funktioniert es oui, alors peux es pas generell am grenier ou bien qui Version Windows liegen.
peut-être peux du nochmal regarder, quoi là qui Unterschiede dans deiner Version trop meiner sommes.
qui verschlankte Code de Matthias funktioniert chez mir incidemment aussi pas.

Aussi fällt mir sur, dass Matthias imprimer verwendet, um cela Bild trop verarbeiten. cela wird dans mon Code vermieden, mais seulement par Speicherschiebereien cela Handle ermittelt.
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
11.06.2020  
 




Matthias
Arlt
@Jörg
j'ai ici sur diesem PC oui aussi XP SP2 sur elle. après que eh bien Roland aucun Probleme beim magasin des Bildes hatte, hab je cela Ganze la fois vite dans einem virtuellen Win 7 probiert. et siehe là...là gibt es aussi ne...aucune Problem!

si sich eh bien qui profaninterne Code lt. Roland à cela OLE-Prozedere de Andreas anlehnt, doit es mais doch Unterschiede donner, car extern funtioniert es oui mittels OLE.

cela imprimer dans mon Code steht là eigentlich seulement, weil je cela Handle angezeigt bekommen voulais. pourquoi mais cet API-variante, qui eigentlich seulement GDI(+)-Funktionen utilise, chez Dir pas allez, c'est moi eh bien wieder un Rätsel.

Mysteriös...mais immerhin une Schritt plus...
 
WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia
11.06.2020  
 




Jörg
Sellmeyer
je habs maintenant aussi sur nem Laptop avec Win7 et 4GB Ram getestet et es funktioniert avec deinem Code. cela erklärt mais toujours pas, pourquoi es chez mir avec meinem Code aussi sur mkeinem minderbemittelten calculateur funktioniert mais pas avec deinem Code.
 
XProfan X4
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
11.06.2020  
 




Matthias
Arlt
c'est oui cela Mysterium...

GDI+ sollte chez XP oui standardmäßig vorhanden son. c'est es alors vmtl. pas.
Du könntest vlt. fois le Rückgabewerte schrittweise pour jeden Funktionsaufruf regarder. Eventuell führt cela quelque chose plus !?

Festhalten peut wir jedenfalls, qui sich create(«PCSI» sous XP (et wohl seulement là) chez Bildern de annähernd 8000x8000 untypisch verhält. ne...aucune Problem, si on cela sais ou bien solche Bilder pas hat.

Den folgenden Passus peux Du aussi aus qui OLE-variante entfernen:

TestHandle& = Créer(«PCSI»,-1,Bild$)
Titre de la fenêtre Str$(TestHandle&) + " chez très grand Bildern ist cela Ergebnis ici 0"
DeleteObject TestHandle&

OLE venez sans ihn aus et nécessaire ihn pas (systemunabhängig). c'est pourquoi ist il là m.E. aussi pas hilfreich (et stiftet vlt. Verwirrung).
 
WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia
11.06.2020  
 



 
- page 3 -



Jörg
Sellmeyer
qui Code ist large en entfernt, comme lauffähiger/nutzbarer Code trop dienen.
Bisher dient il seulement trop Test- et Anschauungszwecken.
 
XProfan X4
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
11.06.2020  
 




Matthias
Arlt
seul so comment il est vlt. moins mais comme ausbaufähige la base déjà.
cela quoi il 1faire soll "Laden et Anzeigen" klappt doch problemlos.
 
WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia
11.06.2020  
 




RGH
je ne sais pas, si on Energie pour Probleme verwenden sollte, qui seulement beim wirklich veralteten Windows XP auftreten ... zumal je aucun Possibilité plus habe, sous XP trop testen.

Salut
Roland
 
XProfan X4
Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4
11.06.2020  
 




Matthias
Arlt
@Roland
non, je vois là aussi keinen Handlungsbedarf, après que cela Problem erkannt et eingegrenzt ist et es funktionierende Workarrounds gibt.

avec dem vieilli chez XP ist cela hin et wieder pas so simple. Pour bestimmte technische Anwendungen ist XP quelquefois déjà quelque chose comme comment qui kleinste gemeinsame Nenner, um unverhältnismäßigen Aufwand trop vermeiden.
 
WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia
11.06.2020  
 




Jörg
Sellmeyer
@Roland; Bien sûr peux Je l' Standpunkt comprendre - richtig akzeptieren peux je qui Einstellung pas.

und dir ici pas (seulement) um une veraltete Version Windows, mais um un Programme. quoi à einer Stelle unnötig Resourcen verbrät. là peux on sich léger sur den Standpunkt zurückziehen, soll qui Kunde sich doch quoi Neues/Nouvelles achetons, ensuite fonctionne es aussi wieder. c'est mais une Einstellung, qui mittlerweile en supplément geführt hat, dass PC, qui früher High-Fin-Maschinen étions, heutzutage, à peine encore comme Bürocomputer valoir, weil selbst qui Schreibprogramm so verschwenderisch avec Plattenplatz et Ram tourner autour de, dass alle deux Jahre un neuer PC hermuss, si on chez cette Software Uptodate son veux.
Profan ist trop Glück large entfernt de solch absurden Auswüchsen, mais es bietet sich à, dem Pfad treu trop rester, si es doch offensichtlich une Alternative gibt, qui oui anscheinend gar pas soweit entfernt de den de toute façon eingebauten Codeteilen trop son scheint.

Grundlage de meinem Code, ist oui c'est ca qui Code  [...]  de Andreas. nie gemacht seulement dans un super emballé, weil mir cela Format comme.
qui einzige Unterschied ist, dass je cela Bild pas avec den Olemitteln sur den Bildschirm bringe, mais cela Handle nutze, um es plus avec Profanmitteln trop verarbeiten.
Peut-être cela oui déjà qui Punkt, wohin dans deinem Code une kleine Changement Wunder bewirken pourrait.
 
XProfan X4
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
12.06.2020  
 




Matthias
Arlt
je hab den "schlanken" Code nochmal révisée. là étions im zèle des Probierens 2 Profan-Befehle drin geblieben, qui dans qui API-Routine pas hineingehören.
 
WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia
12.06.2020  
 




Zum Quelltext


Topictitle, max. 100 marque.
 

Systemprofile:

ne...aucune Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

s'il te plaît s'inscrire um une Beitrag trop verfassen.
 

Options du sujet

9.431 Views

Untitledvor 0 min.
Georg Teles23.05.2024
Sven Bader22.11.2023
Rainer Hoefs01.05.2023
Normann Strübli29.01.2023
plus...

Themeninformationen



Admins  |  AGB  |  Applications  |  Auteurs  |  Chat  |  protection des données  |  Télécharger  |  Entrance  |  Aider  |  Merchantportal  |  Empreinte  |  Mart  |  Interfaces  |  SDK  |  Services  |  Jeux  |  cherche  |  Support

un projet aller XProfaner, qui il y a!


Mon XProfan
Privé Nouvelles
Eigenes Ablageforum
Sujets-La liste de voeux
Eigene Posts
Eigene Sujets
Zwischenablage
Annuler
 Deutsch English Français Español Italia
Traductions

protection des données


Wir verwenden Cookies seulement comme Session-Cookies à cause de qui technischen Notwendigkeit et chez uns gibt es aucun Cookies de Drittanbietern.

si du ici sur unsere Webseite klickst ou bien navigierst, stimmst du unserer Erfassung de Informationen dans unseren Cookies sur XProfan.Net trop.

Weitere Informationen trop unseren Cookies et en supplément, comment du qui Kontrolle par-dessus behältst, findest du dans unserer nachfolgenden Datenschutzerklärung.


d'accordDatenschutzerklärung
je voudrais keinen Cookie