Funktionreferenz


_WinAPI_CreateDIB

Beschreibung anzeigen in

Erzeugt eine unkomprimierte geräteunabhängige Bitmap (DIB) mit der angegebenen Breite, Höhe und Farbtiefe.

#include <WinAPIGdi.au3>
_WinAPI_CreateDIB ( $iWidth, $iHeight [, $iBitsPerPel = 32 [, $tColorTable = 0 [, $iColorCount = 0]]] )

Parameter

$iWidth Die Breite des Bitmaps in Pixeln.
$iHeight Die Höhe des Bitmaps in Pixeln. Wenn dieser Wert positiv ist, so ist die Bitmap eine von unten nach oben DIB und ihr Ursprung ist die linkere untere Ecke, anderenfalls ist die Bitmap eine von oben nach unten DIB und ihr Ursprung befindet sich in der oberen linken Ecke.
$iBitsPerPel [optional] Die Anzahl an Bits welche jedes einzelne Pixel und die maximale Anzahl an Farben in der Bitmap beschreiben. Standard ist 32.
$tColorTable [optional] Eine "dword[n]" Struktur welche die DIB Farbtabelle repräsentiert.
Die Anzahl an Farben in der Tabelle hängt von den Werten des $iBitsPerPel Parameters ab.
$iColorCount [optional] Die Anzahl an Farbindexen in der DIB Farbtabelle welche tatsächlich von der Bitmap verwendet werden.
Der Wert des Parameters sollte nicht die Anzahl an Farben in der Farbtabelle, auf welche von dem $pColorTable Parameter gezeigt wird, überschreiten. Standard ist 0.

Rückgabewert

Erfolg: Das Handle des DIBs.
Fehler: 0 und setzt das @error Flag auf ungleich null.

Bemerkungen

Wenn die Bitmap monochromatisch (1 Bit pro Pixel), so sollte die Farbtabelle zwei Einträge enthalten.
Wenn keine Farbtabelle angegeben wurde, so erstellt diese Funktion eine monochromatische Bitmap mit schwarz und weiß als Farben. Wenn die Bitmap 4 doer 8 Bits pro Pixel verwendet, so sollte die Farbtabelle bis zu 16 oder respektive 256 Einträge enthalten.
In diesem Falle, sofern die Farbtabelle nicht angegeben wurde, wird die Funktion eine leere Farbtabelle erzeugen (alle Farben sind schwarz) mit der maximal möglichen Anzahl an einträgen für die angegebene Farbtiefe.
Man kann später die Farbtabelle mittels der _WinAPI_SetDIBColorTable() Funktion ausfüllen.
Wenn die Bitmap 16, 24 oder 32 Bits pro Pixel verwendet, so wird die Farbtabelle nicht verwendet und der $tColorTable wird ignoriert.

Diese Funktion erstellt keine komprimierte 16, 24, oder 32 Bits pro Pixel Bitmaps welche das "biCompression" Mitglied der $tagBITMAPINFO Struktur ist immer 0 ($BI_RGB).

Wenn die Arbeit mit der Bitmap abgeschlossen ist, so sollte man sie mit der _WinAPI_DeleteObject() Funktion zerstören.

Um einen Pointer zum aktuellen Standort der DIB Bit Werte zu bekommen sollte man _WinAPI_GetExtended() verwenden.

Verwandte Funktionen

_WinAPI_DeleteObject, _WinAPI_GetExtended

Beispiel

#include <GUIConstantsEx.au3>
#include <SendMessage.au3>
#include <StaticConstants.au3>
#include <WinAPIGdi.au3>
#include <WinAPIGdiDC.au3>
#include <WinAPIHObj.au3>
#include <WinAPIMem.au3>
#include <WinAPIMisc.au3>

; Create array of colors of 256 entries required for 8 bits-per-pixel bitmap
Local $aColorTable[256]
For $i = 0 To 255
    $aColorTable[$i] = _WinAPI_RGB(0, $i, 255 - $i)
Next

; Create color table from an array of colors
Local $tColorTable = _WinAPI_CreateDIBColorTable($aColorTable)

; Create 8 bits-per-pixel device-independent bitmap (DIB) and retrieve a pointer to the location of its bit values
Local $hBitmap = _WinAPI_CreateDIB(256, 256, 8, $tColorTable, 256)
Local $pBits = _WinAPI_GetExtended()

; Fill bitmap color indexes
For $i = 0 To 255
    _WinAPI_FillMemory($pBits + 256 * $i, 256, $i)
Next

; Create GUI
Local $hForm = GUICreate('Test ' & StringReplace(@ScriptName, '.au3', '()'), 256, 256)
Local $idPic = GUICtrlCreatePic('', 0, 0, 256, 256)
Local $hPic = GUICtrlGetHandle($idPic)

; Create DDB from DIB to correct display in control
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)

; Set bitmap to control
_SendMessage($hPic, $STM_SETIMAGE, 0, $hDev)
Local $hObj = _SendMessage($hPic, $STM_GETIMAGE)
If $hObj <> $hDev Then
    _WinAPI_DeleteObject($hDev)
EndIf

; Show GUI
GUISetState(@SW_SHOW)

; Save 8 bits-per-pixel bitmap to .bmp file
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