Crée un bitmap indépendant du périphérique (DIB) et non compressé, avec la largeur, la hauteur et la profondeur de couleur spécifiées
#include <WinAPIGdi.au3>
_WinAPI_CreateDIB ( $iWidth, $iHeight [, $iBitsPerPel = 32 [, $tColorTable = 0 [, $iColorCount = 0]]] )
$iWidth | La largeur du bitmap en pixels. |
$iHeight | La hauteur du bitmap en pixels. Si cette valeur est positive, le bitmap est un DIB de bas en haut et son origine est le coin inférieur gauche, sinon, le bitmap est un DIB de haut en bas et son origine est le coin supérieur gauche. |
$iBitsPerPel | [optionnel] Le nombre de bits qui définissent chaque pixel et le nombre maximum de couleurs dans le bitmap. La valeur par défaut est 32. |
$tColorTable | [optionnel] La structure "dword[n]" qui représente la table de couleurs du DIB. Le nombre de couleurs dans cette table dépend de la valeur du paramètre $iBitsPerPel. |
$iColorCount | [optionnel] Le nombre d'index de couleur dans la table des couleurs DIB qui sont effectivement utilisés par le bitmap. La valeur de ce paramètre ne doit pas dépasser le nombre de couleurs dans la table des couleurs pointé par le paramètre $pColorTable. La valeur par défaut est 0. |
Succès: | Retourne le handle de la DIB. |
Échec: | Retourne 0 et définit @error <> 0. |
Si le bitmap est monochrome (1 bit par pixel), la table des couleurs doit contenir deux entrées.
Si la table de couleur n'est pas spécifié, la fonction crée un bitmap monochrome avec deux couleurs: noir et blanc. Si le bitmap utilise 4 ou 8 bits par pixel, la table des couleurs devrait contenir jusqu'à 16 ou 256 entrées respectivement.
Dans ce cas, si la table de couleur n'est pas spécifiée, la fonction crée une table de couleurs vide (toutes les couleurs sont le noir) avec le plus grand nombre possible d'entrées pour la profondeur de couleur spécifiée.
Vous pouvez remplir cette table de couleur ultérieurement en utilisant la fonction _WinAPI_SetDIBColorTable().
Si le bitmap utilise 16, 24 ou 32 bits par pixel, la table des couleurs n'est pas utilisée, et le paramètre $tColorTable est ignoré.
Cette fonction ne crée pas des bitmaps 16, 24, ou 32 bits par pixel compressés, ce qui est le membre "biCompression" de la structure $tagBITMAPINFO qui est toujours 0 ($BI_RGB).
Lorsque vous avez fini d'utiliser le bitmap, détruisez-le en utilisant la fonction _WinAPI_DeleteObject().
Appelez _WinAPI_GetExtended() pour obtenir un pointeur vers l'emplacement des valeurs de bits DIB.
_WinAPI_DeleteObject, _WinAPI_GetExtended
#include <GUIConstantsEx.au3> #include <SendMessage.au3> #include <StaticConstants.au3> #include <WinAPIGdi.au3> #include <WinAPIGdiDC.au3> #include <WinAPIHObj.au3> #include <WinAPIMem.au3> #include <WinAPIMisc.au3> ; Crée un tableau de couleur de 256 entrées nécessaire pour un bitmap de 8 bits par pixel Local $aColorTable[256] For $i = 0 To 255 $aColorTable[$i] = _WinAPI_RGB(0, $i, 255 - $i) Next ; Crée la table de couleur à partir du tableau de couleur Local $tColorTable = _WinAPI_CreateDIBColorTable($aColorTable) ; Crée un bitmap indépendant du périphérique (DIB) de 8 bits par pixel and récupère un pointeur sur la position de ses valeurs de bit Local $hBitmap = _WinAPI_CreateDIB(256, 256, 8, $tColorTable, 256) Local $pBits = _WinAPI_GetExtended() ; Remplit les index des couleurs du bitmap For $i = 0 To 255 _WinAPI_FillMemory($pBits + 256 * $i, 256, $i) Next ; Crée une GUI Local $hForm = GUICreate('Test ' & StringReplace(@ScriptName, '.au3', '()'), 256, 256) Local $idPic = GUICtrlCreatePic('', 0, 0, 256, 256) Local $hPic = GUICtrlGetHandle($idPic) ; Crée un bitmap DDB à partir d'un bitmap DIB pour un affichage correct dans le contrôle Local $hDC = _WinAPI_GetDC($hPic) Local $hDev = _WinAPI_CreateCompatibleBitmap($hDC, 256, 256) Local $hMemDC = _WinAPI_CreateCompatibleDC($hDC) Local $hMemSv = _WinAPI_SelectObject($hMemDC, $hDev) _WinAPI_DrawBitmap($hMemDC, 0, 0, $hBitmap) _WinAPI_ReleaseDC($hPic, $hDC) _WinAPI_SelectObject($hMemDC, $hMemSv) _WinAPI_DeleteDC($hMemDC) ; Définit le bitmap du contrôle $hPic _SendMessage($hPic, $STM_SETIMAGE, 0, $hDev) Local $hObj = _SendMessage($hPic, $STM_GETIMAGE) If $hObj <> $hDev Then _WinAPI_DeleteObject($hDev) EndIf ; Affiche la GUI GUISetState(@SW_SHOW) ; Sauvegarde le bitmap 8 bits par pixel dans un fichier .bmp Local $sPath = FileSaveDialog('Save Image', @TempDir, 'Bitmap Image Files (*.bmp)', 2 + 16, 'MyImage.bmp', $hForm) If $sPath Then _WinAPI_SaveHBITMAPToFile($sPath, $hBitmap, 2834, 2834) EndIf Do Until GUIGetMsg() = $GUI_EVENT_CLOSE