Hallo,
ich möchte gern aus eine BMP (1bit) die Pixeln auslesen, und zwar so das ich für alle 8 pixel 1 Byte erstelle.
Mein bild hat immer 32*x , 32*y pixel, und ich werde mein Bild von ObenLinks nach UntenRechts lesen.
Also: wenn die ersten Pixel Oben links so aussehen:
werde ich (irgendwie) in Binär 0b11000000 haben (möchten!) oder 0xC0 in mein Endergebnis haben.
Ich versuche eine Procedure in Delphi nachzumachen. In Delphi wird Scanlines verwendet. Leider hat AutoIT3 kein Scanline, so weit ich das sehe.
So weit bin ich gekommen: es geht, aber ist relativ langsam: 11-14 Sekunden. Problem ist warscheinlich, ich lese 32 Bit obwohl min Bild nur 8 Bit ist.
Spoiler anzeigen
#include <Constants.au3>
#include <GUIConstantsEx.au3>
#include <GDIPlus.au3>
Example()
[/autoit] [autoit][/autoit] [autoit]Func Example()
[/autoit] [autoit][/autoit] [autoit]Local $sFile = @ScriptDir & "\template.bmp"
[/autoit] [autoit][/autoit] [autoit]_GDIPlus_Startup()
Local $hImage = _GDIPlus_ImageLoadFromFile($sFile) ;create an image object based on a file
Local $iW = _GDIPlus_ImageGetWidth($hImage), $iH = _GDIPlus_ImageGetHeight($hImage) ;get width and height of the image
[/autoit] [autoit][/autoit] [autoit]; what is difference between bitmap and image ?
Local $hBitmap = _GDIPlus_BitmapCreateFromFile($sFile)
Local $tBitmapData = _GDIPlus_BitmapLockBits($hBitmap, 0, 0, $iW, $iH, $GDIP_ILMREAD, $GDIP_PXF32ARGB) ;locks a portion of a bitmap for reading and writing. More infor at http://msdn.microsoft.com/en-us/library/…8(v=vs.85).aspx
[/autoit] [autoit][/autoit] [autoit]Local $iScan0 = DllStructGetData($tBitmapData, "Scan0") ;get scan0 (pixel data) from locked bitmap
; the struct must match the format of pixel data...
Local $tPixel = DllStructCreate("int[" & $iW * $iH & "];", $iScan0)
Local $iPixel, $iRowOffset
Local $out = ""
$t = TimerInit()
[/autoit] [autoit][/autoit] [autoit]ConsoleWrite("Struct size " & DllStructGetSize($tPixel) & @LF)
; Read vertically...
; go over each column
For $myColumn = 1 To $iH
; then for each row
For $myRow = 1 To $iW
; index starts at 1
; pixel at col 1, row 2 is at 1 + iW
$pixelIndex = ($myRow - 1) * $iW + $myColumn
;~ ConsoleWrite("col =" & $myColumn & ", row = " & $myrow & " : " & $pixelIndex & @LF)
; USE: DllStructGetData ( Struct, Element [, index = Default]
$iPixel = DllStructGetData($tPixel, 1, $pixelIndex) ;get pixel color
$out &=hex($iPixel)& @CRLF
Next
Next
ConsoleWrite("Reading vertically ==> " & TimerDiff($t) & @LF)
[/autoit] [autoit][/autoit] [autoit]_GDIPlus_BitmapUnlockBits($hBitmap, $tBitmapData) ;unlocks a portion of a bitmap that was locked by _GDIPlus_BitmapLockBits
FileDelete(@ScriptDir & "\pixels.txt")
FileWrite(@ScriptDir & "\pixels.txt", $out)
;cleanup resources
_GDIPlus_ImageDispose($hImage)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_Shutdown()
EndFunc ;==>Example
[/autoit]Ich habe Beispiel "template.bmp" im Anhang.
Bei Delphi dauert dieser Procedur nur wenige Sekunden.
PS: Deutsch ist nicht meine Muttersprache, entschuldige Sprachfehler...