[UDF] Bitmap <-> Binary String

Partagez des fonctions et des UDF AutoIt.
Règles du forum
.
Répondre
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

[UDF] Bitmap <-> Binary String

#1

Message par matwachich »

Suite à ma question, j'ai créer ce petit UDF (3 fonctions) qui permet de simplement convertir des objets Bitmap en Binary String, et vice vers ça, sans passer par le disque dur (mémoire uniquement).

Les fonctions ne sont pas de moi, mais du grand maître de GDI+: UEZ, et un peut de ProgAndy.

J'ai essayé de faire des fonctions moi même, mais je suis partie sur une piste plus compliquée!
Fichiers joints
Bitmap_String.zip
(2.4 Kio) Téléchargé 68162 fois
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [UDF] Bitmap <-> Binary String

#2

Message par Iste »

Merci beaucoup !
J'avais déjà essayé mais sans y arriver.
Signez ici
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2085
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [UDF] Bitmap <-> Binary String

#3

Message par TommyDDR »

:shock: ... J'en ai rêvé de cette fonction !
Un grand merci à toi !
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Avatar du membre
corrs78
Niveau 5
Niveau 5
Messages : 160
Enregistré le : lun. 13 août 2007 17:38
Localisation : Yvelines
Status : Hors ligne

Re: [UDF] Bitmap <-> Binary String

#4

Message par corrs78 »

J'ai testé l'exemple, mais j'avoue ne pas avoir compris le but de cette fonction.

quelqu'un pourrait éclairer ma lanterne :idea:

merci
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [UDF] Bitmap <-> Binary String

#5

Message par mikell »

Moi non plus :oops: surtout que

Code : Tout sélectionner

$str = _Bitmap2BinaryString($bitmap, 100)
$bitmap = _BinaryString2Bitmap($str)
_GDIPlus_ImageSaveToFile($bitmap, @ScriptDir & "\test.jpg")
donne le même résultat que

Code : Tout sélectionner

$str = _Bitmap2BinaryString($bitmap, 100)
FileWrite(@ScriptDir & "\test.jpg", $str)
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

Re: [UDF] Bitmap <-> Binary String

#6

Message par matwachich »

L'intérêt est de transformer un Objet GDI+ (Bitmap ou Image) en chaîne binaire représentant un fichier image (jpg en l’occurrence), et vice vers ça.

Par exemple, avec ça, vous pouvez stocker vos images jpg dans le script sous forme de variable (chaîne binaire), et les charger directement en objet GDI+.
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [UDF] Bitmap <-> Binary String

#7

Message par mikell »

Mais c'est pas nouveau ce principe, Tlem avait déjà posté sur ce sujet, là
http://www.autoitscript.fr/forum/viewto ... geToBinary
et là
http://www.autoitscript.fr/forum/viewto ... =21&t=7735
Où est la différence ?
matwachich a écrit :... et vice vers ça.
Vers quoi ? :mrgreen:

@corrs78
Voilà un exemple d'application
clavier5.au3
(72.34 Kio) Téléchargé 68043 fois
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

Re: [UDF] Bitmap <-> Binary String

#8

Message par matwachich »

Et bien voila!
Avec l'UDF de tlem, vous transformez vos images en chaines binaires, et au lieux de les décompresser dans un dossier temporaire pour en suite les charger dans des objets GDI+, vous les avez directement!
Et aussi, autre exemple d'utilisation:
- Si vous voulez transmettre une capture d'écran d'un programme à un autre (TCP par exemple) sans passer par le disque dure???

- Quand à la fonction load_bmp_from_mem, c'est vrai que c'est la même chose.
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2085
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [UDF] Bitmap <-> Binary String

#9

Message par TommyDDR »

matwachich a écrit :- Si vous voulez transmettre une capture d'écran d'un programme à un autre (TCP par exemple) sans passer par le disque dure???
C'est exactement l'utilisation que j'ai de ton UDF ^^. Ne pas passer par un fichier change la vie.
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Avatar du membre
RL77LUC
Niveau 5
Niveau 5
Messages : 173
Enregistré le : mar. 21 sept. 2010 16:54
Status : Hors ligne

Re: [UDF] Bitmap <-> Binary String

#10

Message par RL77LUC »

Pourrais-tu nous concocter un exemple concret ? Histoire de connaître le rendu de tout cela ^^.
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2085
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [UDF] Bitmap <-> Binary String

#11

Message par TommyDDR »

@Mikell, votre exemple écrit dans un fichier, l UDF est justement fait pour ne pas se servir d'un fichier.

Vous avez une image en mémoire ($hBitmap) et vous voulez envoyer cette image par TCP et l'afficher, vous avez 2 solutions :

1) - Enregistrer votre $hBitmap dans un fichier
- Ouvrir le fichier
- Lire le fichier
- Fermer le fichier
- Envoyer les données
- Réceptionner les données
- Ouvrir un nouveau fichier
- Écrire les données dans le fichier
- Fermer le fichier
- Affecter le fichier de l'image à un control

2) - Faire un _Bitmap2BinaryString()
- Envoyer les données
- Réceptionner les données
- Faire un _BinaryString2Bitmap()
- Afficher l'image sur un control

10 étapes contre 5 et bien sur, l'accès au disque dur est l'action la plus lente de ces étapes.

En espérant que l'exemple soit assez clair..
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [UDF] Bitmap <-> Binary String

#12

Message par mikell »

TommyDDR a écrit :@Mikell, votre exemple écrit dans un fichier
:shock:
J'aurais juré le contraire, en envoyant l'image directement de la mémoire vers le GuiCtrlCreatePic...
Quelle est dans mon script l'instruction qui écrit dans un fichier ?
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
corrs78
Niveau 5
Niveau 5
Messages : 160
Enregistré le : lun. 13 août 2007 17:38
Localisation : Yvelines
Status : Hors ligne

Re: [UDF] Bitmap <-> Binary String

#13

Message par corrs78 »

Ça doit faire des chaînes de caractères super longues. Du coup le fichier source doit prendre un bon paquet de ligne.
Je vais tester ça, parce que la fonction fileinstall n'est pas très souple.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [UDF] Bitmap <-> Binary String

#14

Message par mikell »

ça dépend de ce qu'on appelle fichier source...
TommyDDR fait une capture et la transmet, la chaîne n'existe qu'en mémoire et n'est jamais écrite dans aucun fichier
Dans mon exemple, après conversion les chaînes sont simplement stockées dans le script, et envoyées vers les controles en passant par la mémoire (sans fichier image écrit sur le disque), et là pour 6 petites images ça représente effectivement dans mon éditeur environ 900 lignes sur 1000 pour un .au3 de 72 Ko :mrgreen:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2085
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [UDF] Bitmap <-> Binary String

#15

Message par TommyDDR »

@mikel : je parlais du script :

Code : Tout sélectionner

$str = _Bitmap2BinaryString($bitmap, 100)
$bitmap = _BinaryString2Bitmap($str)
_GDIPlus_ImageSaveToFile($bitmap, @ScriptDir & "\test.jpg")
Je n'avais pas vu l'archive.
Concernant celle-ci, vous êtes figé au début de votre script aux nombre d'images que vous avez dans le code source... moyen moyen ^^, pour une impression écran pas exemple c'est assez compliqué.
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [UDF] Bitmap <-> Binary String

#16

Message par mikell »

Ah oué oué, mais ce script-là n'était pas un exemple, c'était pour mettre en parallèle la fonction de Tlem et celle de mat
TommyDDR a écrit :Concernant celle-ci, vous êtes figé au début de votre script aux nombre d'images que vous avez dans le code source... moyen moyen ^^
Bah pourquoi, dans la mesure où le script est volontairement limité et n'utilise que ces images-là exclusivement sans rien chercher de plus ?
Pour l'usage auquel il est destiné, avoir un nb d'images fixe est cohérent ^^
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2085
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [UDF] Bitmap <-> Binary String

#17

Message par TommyDDR »

Oui mais vous vouliez un avantage pour _Bitmap2BinaryString()
Je vous en donne un ^^.
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2085
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [UDF] Bitmap <-> Binary String

#18

Message par TommyDDR »

Je ne vois pas de sujet plus récent sur cet UDF donc je prends ma pioche et ma pelle pour le déterrer !
@matwachich : Depuis la version 3.3.14, la fonction _Bitmap2BinaryString renvoie une chaine "corrompue" (pas vide mais la chaine renvoyée n'est pas directement exploitable en l'écrivant dans un fichier) après plusieurs tests, v3.3.12 / v3.3.14, le comportement ne change pas en fonction des UDFs mais en fonction de la version d'AutoIt3_x64.exe
Aurais-tu l'amabilité de remettre la main à la patte pour adapter le script et qu'il soit compatible v3.3.14 ? :)

Ci-joint, un code testable :
#include <GDIPlus.au3>
#include <GDIPlusConstants.au3>
#include <Memory.au3>
#include <ScreenCapture.au3>
#include <WinAPI.au3>
#include <WinAPICom.au3>
#include-once

_GDIPlus_Startup()

Local $str = PrepareImpr()
Local $file = FileOpen(@DesktopDir & "\b.jpg", 2)
FileWrite($file, BinaryToString($str))
FileClose($file)

_GDIPlus_Shutdown()

Func PrepareImpr()
   Local $hwnd = WinGetHandle("[CLASS:Progman]")
   Local $hBitmap = _ScreenCapture_CaptureWnd("", $hWnd)
   Local $bitmap = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
   _GDIPlus_ImageSaveToFile($bitmap, @DesktopDir & "\a.jpg")
   _WinAPI_DeleteObject($hBitmap)
   ConsoleWrite($bitmap & @CRLF)
   Local $string = _Bitmap2BinaryString($bitmap)
   _GDIPlus_ImageDispose($bitmap)
   Return $string
EndFunc

;GDIPlus.au3 must be included; JPG quality: 0 - 100 (worst - best)
;$Bitmap must be a GDI+ compatible bitmap format!!!
Func _Bitmap2BinaryString($Bitmap, $JPEG_Quality = 90) ;code by Andreik, modified by UEZ
    Local $declared = True
    If Not $__g_hGDIPDll Then
        _GDIPlus_Startup()
        $declared = False
    EndIf
   ; ---
    Local $STREAM = _WinAPI_CreateStreamOnHGlobal(0)
    Local $JPG_ENCODER = _GDIPlus_EncodersGetCLSID("JPG")
    Local $TAG_ENCODER = _WinAPI_GUIDFromString($JPG_ENCODER)
    Local $PTR_ENCODER = DllStructGetPtr($TAG_ENCODER)
    Local $tParams = _GDIPlus_ParamInit (1)
    Local $tData = DllStructCreate("int Quality")
    DllStructSetData($tData, "Quality", $JPEG_Quality)
    Local $pData = DllStructGetPtr($tData)
    _GDIPlus_ParamAdd($tParams, $GDIP_EPGQUALITY, 1, $GDIP_EPTLONG, $pData)
    Local $pParams = DllStructGetPtr($tParams)
    DllCall($__g_hGDIPDll, "uint", "GdipSaveImageToStream", "ptr", $Bitmap, "ptr", $STREAM, "ptr", $PTR_ENCODER, "ptr", $pParams)
    $tData = 0
    $tParams = 0
    Local $MEMORY = DllCall("ole32.dll", "uint", "GetHGlobalFromStream", "ptr", $STREAM, "ptr*", 0)
    $MEMORY = $MEMORY[2]
    Local $MEM_SIZE = _MemGlobalSize($MEMORY)
    Local $MEM_PTR = _MemGlobalLock($MEMORY)
    Local $DATA_STRUCT = DllStructCreate("byte[" & $MEM_SIZE & "]", $MEM_PTR)
    Local $DATA = DllStructGetData($DATA_STRUCT, 1)
    Local $tVARIANT = DllStructCreate("word vt;word r1;word r2;word r3;ptr data; ptr")
    DllCall("oleaut32.dll", "long", "DispCallFunc", "ptr", $STREAM, "dword", 8 + 8 * @AutoItX64, "dword", 4, "dword", 23, "dword", 0, "ptr", 0, "ptr", 0, "ptr", DllStructGetPtr($tVARIANT))
    _MemGlobalFree($MEMORY)
   ; ---
    If Not $declared Then _GDIPlus_Shutdown()
    Return $DATA
EndFunc
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Répondre