Post by just me » 29 Jun 2020, 05:20
Moin,
die beiden Dateien sind interessant. Die SDA-Datei enthält einen "Spiegel" der BMP Rohdaten, soll heißen: in SDA steht 0 für Schwarz, in BMP für Weiß. (Bei der Erweiterung SDA klingelt es irgendwo tief in meinen vergrabenen Erinnerungen, es kommt aber nichts hoch.)
Es scheint mir gelungen zu sein, mit GDI (ohne +) eine Schwarzweißbitmap zu erstellen. Außerdem habe ich in meinem Fundus noch Routinen für das Abspeichern der BMP-Datei und die Übernahme ins Clipboard gefunden. Nach kleineren Anpassungen scheinen auch die zu tun. Ich weiß nicht mehr, wo ich die 'entwendet' habe. Ich glaube, die Originale stammen von SKAN.
Code: Select all
#NoEnv
SetBatchLines, -1
SetWorkingDir, %A_ScriptDir%
LogoPicFile := "TMLOG1TB.SDA"
If !(DataFile := FileOpen(LogoPicFile, "r")) {
MsgBox, 16, Error!, Die Datei %LogoPicFile% konnte nicht geöffnet werden!
ExitApp
}
If (DataFile.Length = 6240) {
Width := 384
Height := 130
Spalten := 48
}
Else If (DataFile.Length = 9360) {
Width := 576
Height := 130
Spalten := 72
}
Else {
MsgBox, 16, Error!, Die Datei %LogoPicFile% ist fehlerhaft!
DataFile.Close()
ExitApp
}
DataFile.RawRead(PixelData, DataFile.Length)
HBM := CreateBM(PixelData, Width, Height)
DataFile.Close()
BitMapInfo(HBM)
SaveBM(HBM, "Test2.bmp")
Gui, Add, Text, , SDA:
Gui, Add, Pic, , HBITMAP:*%HBM%
Gui, Add, Text, , Original:
Gui, Add, Pic, , Test.bmp
Gui, Add, Text, , Kopie:
Gui, Add, Pic, , Test2.bmp
Gui, Show, , Bitmap
BM2Clipboard(HBM)
Return
GuiClose:
ExitApp
; ================================================================================================================================
BitMapInfo(HBM) {
Static Size := (A_PtrSize = 8) ? 32 : 24
VarSetCapacity(BM, Size, 0)
DllCall("GetObject", "Ptr", HBM, "Int", Size, "Ptr", &BM)
BW := NumGet(BM, 4, "Int")
BH := NumGet(BM, 8, "Int")
BBW := NumGet(BM, 12, "Int")
BPL := NumGet(BM, 16, "UShort")
BPP := NumGet(BM, 18, "UShort")
MsgBox, Width: %BW%`nHeight: %BH%`nWidthBytes: %BBW%`nPlanes: %BPL%`nBitsPixel: %BPP%
}
; ================================================================================================================================
CreateBM(ByRef PixelData, Width, Height) {
Static HBR := DllCall("CreateSolidBrush", "UInt", 0xFFFFFF, "UPtr")
MDC := DllCall("CreateCompatibleDC", "Ptr", 0, "UPtr")
MBM := DllCall("CreateCompatibleBitmap", "Ptr", MDC, "Int", Width, "Int", Height, "UPtr")
OBM := DllCall("SelectObject", "Ptr", MDC, "Ptr", MBM, "UPtr")
VarSetCapacity(RC, 16, 0)
NumPut(Width, RC, 8, "Int")
NumPut(Height, RC, 12, "Int")
DllCall("FillRect", "Ptr", MDC, "Ptr", &RC, "Ptr", HBR)
WidthBytes := Width // 8
Bytes := WidthBytes * Height
I := 0, X := 0, Y := 0
Loop, %Bytes% {
Loop, %WidthBytes% {
If (B := NumGet(PixelData, I++, "UChar")) {
S := 1 << 7
Loop, 8 {
If (B & S)
DllCall("SetPixel", "Ptr", MDC, "Int", X, "Int", Y, "UInt", 0x0)
S >>= 1
X++
}
}
Else
X += 8
}
X := 0, Y++
}
DllCall("SelectObject", "Ptr", MDC, "Ptr", OBM, "UPtr")
DllCall("DeleteDC", "Ptr", MDC)
Return MBM
}
; ================================================================================================================================
SaveBM(HBM, FilePath) {
Static SizeBM := A_PtrSize = 8 ? 32 : 24 ; BITMAP
, SizeBMFH := 14 ; BITMAPFILEHEADER
, SizeBMIH := 40 ; BITMAPINFOHEADER
, SizeDIB := A_PtrSize = 8 ? 104 : 84 ; DIBSECTION
HDIB := DllCall("CopyImage", "Ptr", HBM, "UInt", 0, "Int", 0, "Int", 0, "UInt", 0x2000, "UPtr")
VarSetCapacity(DIB, SizeDIB, 0)
DllCall("GetObject", "Ptr", HDIB, "Int", SizeDIB, "Ptr", &DIB)
Size := NumGet(DIB, A_PtrSize = 8 ? 52 : 44, "UInt")
PicFile := FileOpen(FilePath, "w", "CP0")
; BITMAPFILEHEADER
PicFile.Write("BM") ; bfType
PicFile.WriteUInt(SizeBMFH + SizeBMIH + Size + 8) ; bfSize
PicFile.WriteUInt(0) ; bfReserved
PicFile.WriteUInt(SizeBMFH + SizeBMIH + 8) ; bfOffBits
; BITMAPINFOHEADER
PicFile.RawWrite(&DIB + SizeBM, SizeBMIH)
; bmicolors
PicFile.WriteUInt(0x000000)
PicFile.WriteUInt(0xFFFFFF)
; bmBits
PicFile.RawWrite(NumGet(DIB, A_PtrSize = 8 ? 24 : 20, "UPtr"), Size)
PicFile.Close()
DllCall("DeleteObject", "Ptr", HDIB)
}
; ================================================================================================================================
BM2Clipboard(HBM) {
Static SizeOfBM := A_PtrSize = 8 ? 32 : 24 ; BITMAP
, SizeOfBMFH := 14 ; BITMAPFILEHEADER
, SizeOfBMIH := 40 ; BITMAPINFOHEADER
, SizeOfDIB := A_PtrSize = 8 ? 104 : 84 ; DIBSECTION
HDIB := DllCall("CopyImage", "Ptr", HBM, "UInt", 0, "Int", 0, "Int", 0, "UInt", 0x2000, "UPtr")
VarSetCapacity(DIB, SizeOfDIB, 0)
DllCall("GetObject", "Ptr", HDIB, "Int", SizeOfDIB, "Ptr", &DIB)
Size := NumGet(DIB, A_PtrSize = 8 ? 52 : 44, "UInt")
HBMP := DllCall("GlobalAlloc", "UInt", 2, "Ptr", SizeOfBMIH + Size + 8, "UPtr")
PBMP := DllCall("GlobalLock", "Ptr", HBMP, "UPtr")
DllCall("RtlMoveMemory", "Ptr", PBMP, "Ptr", &DIB + SizeOfBM, "Ptr", SizeOfBMIH)
NumPut(0x000000, PBMP + SizeOfBMIH, "UINT")
NumPut(0xFFFFFF, PBMP + SizeOfBMIH + 4, "UINT")
DllCall("RtlMoveMemory", "Ptr", PBMP + SizeOfBMIH + 8, "Ptr", NumGet(DIB, A_PtrSize = 8 ? 24 : 20, "UPtr"), "Ptr", Size)
DllCall("GlobalUnlock", "Ptr", HBMP)
DllCall("OpenClipboard", "Ptr", 0)
DllCall("EmptyClipboard")
DllCall("SetClipboardData", "UInt", 8, "Ptr", HBMP)
DllCall("CloseClipboard")
DllCall("DeleteObject", "Ptr", HDIB)
}
Moin,
die beiden Dateien sind interessant. Die SDA-Datei enthält einen "Spiegel" der BMP Rohdaten, soll heißen: in SDA steht 0 für Schwarz, in BMP für Weiß. (Bei der Erweiterung SDA klingelt es irgendwo tief in meinen vergrabenen Erinnerungen, es kommt aber nichts hoch.)
Es scheint mir gelungen zu sein, mit GDI (ohne +) eine Schwarzweißbitmap zu erstellen. Außerdem habe ich in meinem Fundus noch Routinen für das Abspeichern der BMP-Datei und die Übernahme ins Clipboard gefunden. Nach kleineren Anpassungen scheinen auch die zu tun. Ich weiß nicht mehr, wo ich die 'entwendet' habe. Ich glaube, die Originale stammen von SKAN.
[code]#NoEnv
SetBatchLines, -1
SetWorkingDir, %A_ScriptDir%
LogoPicFile := "TMLOG1TB.SDA"
If !(DataFile := FileOpen(LogoPicFile, "r")) {
MsgBox, 16, Error!, Die Datei %LogoPicFile% konnte nicht geöffnet werden!
ExitApp
}
If (DataFile.Length = 6240) {
Width := 384
Height := 130
Spalten := 48
}
Else If (DataFile.Length = 9360) {
Width := 576
Height := 130
Spalten := 72
}
Else {
MsgBox, 16, Error!, Die Datei %LogoPicFile% ist fehlerhaft!
DataFile.Close()
ExitApp
}
DataFile.RawRead(PixelData, DataFile.Length)
HBM := CreateBM(PixelData, Width, Height)
DataFile.Close()
BitMapInfo(HBM)
SaveBM(HBM, "Test2.bmp")
Gui, Add, Text, , SDA:
Gui, Add, Pic, , HBITMAP:*%HBM%
Gui, Add, Text, , Original:
Gui, Add, Pic, , Test.bmp
Gui, Add, Text, , Kopie:
Gui, Add, Pic, , Test2.bmp
Gui, Show, , Bitmap
BM2Clipboard(HBM)
Return
GuiClose:
ExitApp
; ================================================================================================================================
BitMapInfo(HBM) {
Static Size := (A_PtrSize = 8) ? 32 : 24
VarSetCapacity(BM, Size, 0)
DllCall("GetObject", "Ptr", HBM, "Int", Size, "Ptr", &BM)
BW := NumGet(BM, 4, "Int")
BH := NumGet(BM, 8, "Int")
BBW := NumGet(BM, 12, "Int")
BPL := NumGet(BM, 16, "UShort")
BPP := NumGet(BM, 18, "UShort")
MsgBox, Width: %BW%`nHeight: %BH%`nWidthBytes: %BBW%`nPlanes: %BPL%`nBitsPixel: %BPP%
}
; ================================================================================================================================
CreateBM(ByRef PixelData, Width, Height) {
Static HBR := DllCall("CreateSolidBrush", "UInt", 0xFFFFFF, "UPtr")
MDC := DllCall("CreateCompatibleDC", "Ptr", 0, "UPtr")
MBM := DllCall("CreateCompatibleBitmap", "Ptr", MDC, "Int", Width, "Int", Height, "UPtr")
OBM := DllCall("SelectObject", "Ptr", MDC, "Ptr", MBM, "UPtr")
VarSetCapacity(RC, 16, 0)
NumPut(Width, RC, 8, "Int")
NumPut(Height, RC, 12, "Int")
DllCall("FillRect", "Ptr", MDC, "Ptr", &RC, "Ptr", HBR)
WidthBytes := Width // 8
Bytes := WidthBytes * Height
I := 0, X := 0, Y := 0
Loop, %Bytes% {
Loop, %WidthBytes% {
If (B := NumGet(PixelData, I++, "UChar")) {
S := 1 << 7
Loop, 8 {
If (B & S)
DllCall("SetPixel", "Ptr", MDC, "Int", X, "Int", Y, "UInt", 0x0)
S >>= 1
X++
}
}
Else
X += 8
}
X := 0, Y++
}
DllCall("SelectObject", "Ptr", MDC, "Ptr", OBM, "UPtr")
DllCall("DeleteDC", "Ptr", MDC)
Return MBM
}
; ================================================================================================================================
SaveBM(HBM, FilePath) {
Static SizeBM := A_PtrSize = 8 ? 32 : 24 ; BITMAP
, SizeBMFH := 14 ; BITMAPFILEHEADER
, SizeBMIH := 40 ; BITMAPINFOHEADER
, SizeDIB := A_PtrSize = 8 ? 104 : 84 ; DIBSECTION
HDIB := DllCall("CopyImage", "Ptr", HBM, "UInt", 0, "Int", 0, "Int", 0, "UInt", 0x2000, "UPtr")
VarSetCapacity(DIB, SizeDIB, 0)
DllCall("GetObject", "Ptr", HDIB, "Int", SizeDIB, "Ptr", &DIB)
Size := NumGet(DIB, A_PtrSize = 8 ? 52 : 44, "UInt")
PicFile := FileOpen(FilePath, "w", "CP0")
; BITMAPFILEHEADER
PicFile.Write("BM") ; bfType
PicFile.WriteUInt(SizeBMFH + SizeBMIH + Size + 8) ; bfSize
PicFile.WriteUInt(0) ; bfReserved
PicFile.WriteUInt(SizeBMFH + SizeBMIH + 8) ; bfOffBits
; BITMAPINFOHEADER
PicFile.RawWrite(&DIB + SizeBM, SizeBMIH)
; bmicolors
PicFile.WriteUInt(0x000000)
PicFile.WriteUInt(0xFFFFFF)
; bmBits
PicFile.RawWrite(NumGet(DIB, A_PtrSize = 8 ? 24 : 20, "UPtr"), Size)
PicFile.Close()
DllCall("DeleteObject", "Ptr", HDIB)
}
; ================================================================================================================================
BM2Clipboard(HBM) {
Static SizeOfBM := A_PtrSize = 8 ? 32 : 24 ; BITMAP
, SizeOfBMFH := 14 ; BITMAPFILEHEADER
, SizeOfBMIH := 40 ; BITMAPINFOHEADER
, SizeOfDIB := A_PtrSize = 8 ? 104 : 84 ; DIBSECTION
HDIB := DllCall("CopyImage", "Ptr", HBM, "UInt", 0, "Int", 0, "Int", 0, "UInt", 0x2000, "UPtr")
VarSetCapacity(DIB, SizeOfDIB, 0)
DllCall("GetObject", "Ptr", HDIB, "Int", SizeOfDIB, "Ptr", &DIB)
Size := NumGet(DIB, A_PtrSize = 8 ? 52 : 44, "UInt")
HBMP := DllCall("GlobalAlloc", "UInt", 2, "Ptr", SizeOfBMIH + Size + 8, "UPtr")
PBMP := DllCall("GlobalLock", "Ptr", HBMP, "UPtr")
DllCall("RtlMoveMemory", "Ptr", PBMP, "Ptr", &DIB + SizeOfBM, "Ptr", SizeOfBMIH)
NumPut(0x000000, PBMP + SizeOfBMIH, "UINT")
NumPut(0xFFFFFF, PBMP + SizeOfBMIH + 4, "UINT")
DllCall("RtlMoveMemory", "Ptr", PBMP + SizeOfBMIH + 8, "Ptr", NumGet(DIB, A_PtrSize = 8 ? 24 : 20, "UPtr"), "Ptr", Size)
DllCall("GlobalUnlock", "Ptr", HBMP)
DllCall("OpenClipboard", "Ptr", 0)
DllCall("EmptyClipboard")
DllCall("SetClipboardData", "UInt", 8, "Ptr", HBMP)
DllCall("CloseClipboard")
DllCall("DeleteObject", "Ptr", HDIB)
}[/code]