[UDF] Bitmap <-> Binary String
Règles du forum
- Merci de consulter la section "Règles du forum" et plus particulièrement "Règles et Mentions Légales du site autoitscript.fr" avant d'écrire un message.
- matwachich
- Membre émérite
- Messages : 986
- Enregistré le : lun. 19 oct. 2009 04:04
- Localisation : Algérie
- Status : Hors ligne
[UDF] Bitmap <-> Binary String
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!
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é 68656 fois
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
- Iste
- Niveau 11
- Messages : 1870
- Enregistré le : jeu. 04 déc. 2008 14:21
- Localisation : 76
- Status : Hors ligne
Re: [UDF] Bitmap <-> Binary String
Merci beaucoup !
J'avais déjà essayé mais sans y arriver.
J'avais déjà essayé mais sans y arriver.
Signez ici
- TommyDDR
- Modérateur
- Messages : 2093
- Enregistré le : mar. 22 juil. 2008 21:55
- Localisation : Nantes
- Status : Hors ligne
Re: [UDF] Bitmap <-> Binary String
... J'en ai rêvé de cette fonction !
Un grand merci à toi !
Un grand merci à toi !
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
- corrs78
- Niveau 5
- Messages : 160
- Enregistré le : lun. 13 août 2007 17:38
- Localisation : Yvelines
- Status : Hors ligne
Re: [UDF] Bitmap <-> Binary String
J'ai testé l'exemple, mais j'avoue ne pas avoir compris le but de cette fonction.
quelqu'un pourrait éclairer ma lanterne
merci
quelqu'un pourrait éclairer ma lanterne
merci
- mikell
- Spammer !
- Messages : 6292
- Enregistré le : dim. 29 mai 2011 17:32
- Localisation : Deep Cévennes
- Status : Hors ligne
Re: [UDF] Bitmap <-> Binary String
Moi non plus surtout que donne le même résultat que
Code : Tout sélectionner
$str = _Bitmap2BinaryString($bitmap, 100)
$bitmap = _BinaryString2Bitmap($str)
_GDIPlus_ImageSaveToFile($bitmap, @ScriptDir & "\test.jpg")
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 )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
- matwachich
- Membre émérite
- Messages : 986
- Enregistré le : lun. 19 oct. 2009 04:04
- Localisation : Algérie
- Status : Hors ligne
Re: [UDF] Bitmap <-> Binary String
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+.
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
- mikell
- Spammer !
- Messages : 6292
- Enregistré le : dim. 29 mai 2011 17:32
- Localisation : Deep Cévennes
- Status : Hors ligne
Re: [UDF] Bitmap <-> Binary String
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 ?
@corrs78
Voilà un exemple d'application
http://www.autoitscript.fr/forum/viewto ... geToBinary
et là
http://www.autoitscript.fr/forum/viewto ... =21&t=7735
Où est la différence ?
Vers quoi ?matwachich a écrit :... et vice vers ça.
@corrs78
Voilà un exemple d'application
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
- matwachich
- Membre émérite
- Messages : 986
- Enregistré le : lun. 19 oct. 2009 04:04
- Localisation : Algérie
- Status : Hors ligne
Re: [UDF] Bitmap <-> Binary String
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.
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
- TommyDDR
- Modérateur
- Messages : 2093
- Enregistré le : mar. 22 juil. 2008 21:55
- Localisation : Nantes
- Status : Hors ligne
Re: [UDF] Bitmap <-> Binary String
C'est exactement l'utilisation que j'ai de ton UDF ^^. Ne pas passer par un fichier change la vie.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???
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Re: [UDF] Bitmap <-> Binary String
Pourrais-tu nous concocter un exemple concret ? Histoire de connaître le rendu de tout cela ^^.
- TommyDDR
- Modérateur
- Messages : 2093
- Enregistré le : mar. 22 juil. 2008 21:55
- Localisation : Nantes
- Status : Hors ligne
Re: [UDF] Bitmap <-> Binary String
@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..
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
- mikell
- Spammer !
- Messages : 6292
- Enregistré le : dim. 29 mai 2011 17:32
- Localisation : Deep Cévennes
- Status : Hors ligne
Re: [UDF] Bitmap <-> Binary String
TommyDDR a écrit :@Mikell, votre exemple écrit dans un fichier
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 )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
- corrs78
- Niveau 5
- Messages : 160
- Enregistré le : lun. 13 août 2007 17:38
- Localisation : Yvelines
- Status : Hors ligne
Re: [UDF] Bitmap <-> Binary String
Ç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.
Je vais tester ça, parce que la fonction fileinstall n'est pas très souple.
- mikell
- Spammer !
- Messages : 6292
- Enregistré le : dim. 29 mai 2011 17:32
- Localisation : Deep Cévennes
- Status : Hors ligne
Re: [UDF] Bitmap <-> Binary String
ç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
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
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
- TommyDDR
- Modérateur
- Messages : 2093
- Enregistré le : mar. 22 juil. 2008 21:55
- Localisation : Nantes
- Status : Hors ligne
Re: [UDF] Bitmap <-> Binary String
@mikel : je parlais du script :
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é.
Code : Tout sélectionner
$str = _Bitmap2BinaryString($bitmap, 100)
$bitmap = _BinaryString2Bitmap($str)
_GDIPlus_ImageSaveToFile($bitmap, @ScriptDir & "\test.jpg")
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
- mikell
- Spammer !
- Messages : 6292
- Enregistré le : dim. 29 mai 2011 17:32
- Localisation : Deep Cévennes
- Status : Hors ligne
Re: [UDF] Bitmap <-> Binary String
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
Pour l'usage auquel il est destiné, avoir un nb d'images fixe est cohérent ^^
Bah pourquoi, dans la mesure où le script est volontairement limité et n'utilise que ces images-là exclusivement sans rien chercher de plus ?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 ^^
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 )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
- TommyDDR
- Modérateur
- Messages : 2093
- Enregistré le : mar. 22 juil. 2008 21:55
- Localisation : Nantes
- Status : Hors ligne
Re: [UDF] Bitmap <-> Binary String
Oui mais vous vouliez un avantage pour _Bitmap2BinaryString()
Je vous en donne un ^^.
Je vous en donne un ^^.
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
- TommyDDR
- Modérateur
- Messages : 2093
- Enregistré le : mar. 22 juil. 2008 21:55
- Localisation : Nantes
- Status : Hors ligne
Re: [UDF] Bitmap <-> Binary String
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 :
@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
#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