-
Posts
6 -
Joined
-
Last visited
Profile Information
-
Interests
Take the first step in faith. You don't have to see the whole staircase, just take the first step.
Silent_Thunder's Achievements

Seeker (1/7)
0
Reputation
-
Silent_Thunder reacted to a post in a topic: GUI_Extender - New Version 16 Apr 2022
-
Reading pixels from Pic control
Silent_Thunder replied to Silent_Thunder's topic in AutoIt GUI Help and Support
I finally made it, thanx UEZ for the support here is the final script, maybe someone find it useful ;~ #AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w- 7 #include <GDIPlus.au3> #include <MemoryConstants.au3> #include <Memory.au3> #include <Misc.au3> #include <GUIConstants.au3> #include <StaticConstants.au3> #include <Array.au3> #include <File.au3> #Region ### GUI section ### Global $GUI_MAIN = GUICreate("LCD Designer", 300, 200, 192, 124) Global $Pic1 = GUICtrlCreatePic("", 8, 50, 128, 64, $SS_SUNKEN + $SS_CENTERIMAGE + $SS_BITMAP) Global $fSize = GUICtrlCreateInput("11", 152, 50, 50, 20) GUICtrlCreateUpdown($fSize) Local $sLable1 = GUICtrlCreateLabel("Font Size", 210, 53) Global $fSet = GUICtrlCreateButton("Select Font", 152, 80, 75, 25) Global $SetImg = GUICtrlCreateButton("Set TEXT", 8, 152, 75, 25) Global $ClearScrn = GUICtrlCreateButton("Clear Image", 152, 152, 75, 25) Global $rdStart = GUICtrlCreateButton("Save Image", 152, 115, 75, 25) Global $Msgs = GUICtrlCreateLabel("Messages go here", 8, 30, 200, 20) Global $TxT = GUICtrlCreateInput("الله لا اله الا هو", 8, 120, 128, 20) GUISetState(@SW_SHOW) #EndRegion ### GUI section ### ; you can use this to add custom text on a 128 x 64 pixel LCD ; generated file is a hex dump witch u can use in your uC program ; to be displayed on LCD interface ; you may modify it to load any 1bpp image you may create ; just put in mind to use .png format ; it is not a fancy script, but it do the job :) ; special Thanks to UEZ for the great help Global $aBitmaps, $Text, $sFontName, $iFontSize, $sFileName, $arPixel[0] $sFontName = "consolas" ; defult font $iFontSize = 11 ; defult size ;GUICtrlSetData($Msgs, $sFileName) _GDIPlus_Startup() Global $hBmp_Empty = _GDIPlus_BitmapCreateFromScan0(128, 64) Global $hCtx_Empty = _GDIPlus_ImageGetGraphicsContext($hBmp_Empty) _GDIPlus_GraphicsClear($hCtx_Empty, 0xFFF0F0F0) Global $hHBmp_Empty = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmp_Empty) _GDIPlus_GraphicsDispose($hCtx_Empty) _GDIPlus_BitmapDispose($hBmp_Empty) While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE _WinAPI_DeleteObject($hHBmp_Empty) _GDIPlus_ImageDispose($hBmp_Empty) If IsArray($aBitmaps) Then _WinAPI_DeleteObject($aBitmaps[0]) _GDIPlus_ImageDispose($aBitmaps[1]) EndIf _GDIPlus_Shutdown() Exit Case $SetImg $Text = GUICtrlRead($TxT, 0) If IsArray($aBitmaps) Then _WinAPI_DeleteObject($aBitmaps[0]) _GDIPlus_ImageDispose($aBitmaps[1]) EndIf $aBitmaps = Draw_Text($Text) _WinAPI_DeleteObject(GUICtrlSendMsg($Pic1, 0x0172, 0, $aBitmaps[0])) Case $ClearScrn _WinAPI_DeleteObject(GUICtrlSendMsg($Pic1, 0x0172, 0, $hHBmp_Empty)) Case $rdStart Get_Pixels() Case $fSet Font_Set() EndSwitch WEnd Func Font_Set() Local $a_vFont = _ChooseFont($sFontName, $iFontSize) $sFontName = $a_vFont[2] $iFontSize = $a_vFont[3] GUICtrlSetData($fSize, $iFontSize) ;Local $iColorRef = $a_vFont[5] ;Local $iFontWeight = $a_vFont[4] ;Local $bItalic = BitAND($a_vFont[1], 2) ;Local $bUnderline = BitAND($a_vFont[1], 4) ;Local $bStrikethru = BitAND($a_vFont[1], 8) EndFunc ;==>Font_Set Func Get_Pixels() Local $iWidth, $iHeight, $cPixel, $bNum $iWidth = 128 $iHeight = 64 If IsArray($aBitmaps) Then ; comment the if statment if u want to use your own image and press [Save Image] _GDIPlus_ImageSaveToFile($aBitmaps[1], @ScriptDir & "\LCD_Tmp.png") EndIf $hBitmap = _GDIPlus_BitmapCreateFromFile(@ScriptDir & "\LCD_Tmp.png") ; modify to the name of your image file For $iRow = 0 To $iHeight - 1 Step 8 ; number of rows = 64 / 8 For $iX = 0 To $iWidth - 1 $bNum = 0 For $iY = 0 To 7 $cPixel = _GDIPlus_BitmapGetPixel($hBitmap, $iX, $iY + $iRow) $cPixel = BitAND($cPixel, 0xFFFFFF) If $cPixel = 0 Then $bNum += (2 ^ $iY) EndIf Next _ArrayAdd($arPixel, "0x" & Hex($bNum, 2)) Next Next ;_ArrayDisplay($arPixel, " test ") _GDIPlus_ImageDispose($hBitmap) $sFileName = FileSaveDialog(" Save TO ", @ScriptDir, "Text Files (*.txt)", $FD_PROMPTOVERWRITE, "LCD_Dump.txt") FileOpen($sFileName, $FO_OVERWRITE + $FO_BINARY) FileWrite($sFileName, "// 128 x 64 Pixel LCD Array (1024 byte)" & @CRLF) $cItems = 0 For $x = 0 To UBound($arPixel) - 1 $cItems += 1 If $cItems < 16 Then FileWrite($sFileName, $arPixel[$x] & ",") Else FileWrite($sFileName, $arPixel[$x] & "," & @CRLF) $cItems = 0 EndIf Next FileClose($sFileName) Return 0 EndFunc ;==>Get_Pixels Func Draw_Text($sString = "") Local $hGraphic, $hBrush, $hFormat, _ $hFamily, $hFont, $tLayout, _ $aInfo, $hBitmap, $FontSize, _ $iWidth, $iHeight, $fontStyle, _ $hImage $iWidth = 128 $iHeight = 64 $FontSize = GUICtrlRead($fSize, 0) $fontStyle = 1 $hImage = _GDIPlus_BitmapCreateFromScan0($iWidth, $iHeight, $GDIP_PXF01INDEXED) $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage) $hBrush = _GDIPlus_BrushCreateSolid(0xFFFFFFFF) _GDIPlus_GraphicsFillRect($hGraphic, 0, 0, $iWidth, $iHeight, $hBrush) _GDIPlus_BrushDispose($hBrush) $hFormat = _GDIPlus_StringFormatCreate() $hFamily = _GDIPlus_FontFamilyCreate($sFontName) $hFont = _GDIPlus_FontCreate($hFamily, $FontSize, $fontStyle) $tLayout = _GDIPlus_RectFCreate($iWidth / 2 / 5, $iHeight / 3, 0, 0) $aInfo = _GDIPlus_GraphicsMeasureString($hGraphic, $sString, $hFont, $tLayout, $hFormat) $hBrush = _GDIPlus_BrushCreateSolid(0xFF000000) _GDIPlus_GraphicsDrawStringEx($hGraphic, $sString, $hFont, $aInfo[0], $hFormat, $hBrush) $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage) _GDIPlus_FontDispose($hFont) _GDIPlus_BrushDispose($hBrush) _GDIPlus_GraphicsDispose($hGraphic) _GDIPlus_FontFamilyDispose($hFamily) _GDIPlus_StringFormatDispose($hFormat) Local $aBitmaps[2] = [$hBitmap, $hImage] Return $aBitmaps EndFunc ;==>Draw_Text -
Silent_Thunder reacted to a post in a topic: Reading pixels from Pic control
-
Reading pixels from Pic control
Silent_Thunder replied to Silent_Thunder's topic in AutoIt GUI Help and Support
hahahaha, my thoughts too complicated for a reason my aim is not to save the contents of the pic control, but to get every pixel of it into an array, then save the array. that is why I made these loops to construct an array based on that pic contents as I said in my first post. but u already solved a great deal of the problem, I'll try to get the data out of the array u constructed, wish me success and thank you very much UEZ -
Reading pixels from Pic control
Silent_Thunder replied to Silent_Thunder's topic in AutoIt GUI Help and Support
Thank you UEZ for the fast reply here is the full script so far: #AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w- 7 #include <GDIPlus.au3> #include <MemoryConstants.au3> #include <Memory.au3> #include <Misc.au3> #include <GUIConstants.au3> #include <StaticConstants.au3> #include <Array.au3> #include <ScreenCapture.au3> #Region ### GUI section ### Global $GUI_MAIN = GUICreate("LCD", 435, 300, 192, 124) Global $Pic1 = GUICtrlCreatePic("", 8, 50, 128, 64, $SS_SUNKEN + $SS_CENTERIMAGE + $SS_BITMAP) Global $SetImg = GUICtrlCreateButton("Set TEXT", 8, 152, 75, 25) Global $ClearScrn = GUICtrlCreateButton("Clear Image", 152, 152, 75, 25) Global $rdStart = GUICtrlCreateButton("Read Image", 152, 50, 75, 25) Global $Msgs = GUICtrlCreateLabel("Messages go here", 8, 30, 200, 20) Global $TxT = GUICtrlCreateInput("Testing TEXT", 8, 120, 128, 20) GUISetState(@SW_SHOW) #EndRegion ### GUI section ### Global $TempImg, $Text, $sFontName, $sFileName, $arPixel[0] GUICtrlSetData($Msgs, $sFileName) _GDIPlus_Startup() Global $hBmp_Empty = _GDIPlus_BitmapCreateFromScan0(128, 64) Global $hCtx_Empty = _GDIPlus_ImageGetGraphicsContext($hBmp_Empty) _GDIPlus_GraphicsClear($hCtx_Empty, 0xFFF0F0F0) Global $hHBmp_Empty = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmp_Empty) _GDIPlus_GraphicsDispose($hCtx_Empty) _GDIPlus_BitmapDispose($hBmp_Empty) While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE _WinAPI_DeleteObject($hHBmp_Empty) _GDIPlus_Shutdown() Exit Case $SetImg $Text = GUICtrlRead($TxT, 0) $TempImg = Draw_Text($Text) _WinAPI_DeleteObject(GUICtrlSendMsg($Pic1, 0x0172, 0, $TempImg)) _WinAPI_DeleteObject($TempImg) Case $ClearScrn ; do something here to clear the image control _WinAPI_DeleteObject(GUICtrlSendMsg($Pic1, 0x0172, 0, $hHBmp_Empty)) Case $rdStart Get_Pixels() EndSwitch WEnd Func Font_Set() Local $a_vFont = _ChooseFont() $sFontName = $a_vFont[2] ;Local $iFontSize = $a_vFont[3] ;Local $iColorRef = $a_vFont[5] ;Local $iFontWeight = $a_vFont[4] ;Local $bItalic = BitAND($a_vFont[1], 2) ;Local $bUnderline = BitAND($a_vFont[1], 4) ;Local $bStrikethru = BitAND($a_vFont[1], 8) EndFunc ;==>Font_Set Func Image_AR() EndFunc ;==>Image_AR Func Get_Pixels() Local $iWidth, $iHeight, $cPixel, $bNum $iWidth = 128 $iHeight = 64 ;Local $hGfx1 = _GDIPlus_GraphicsCreateFromHWND(ControlGetHandle($GUI_MAIN, "LCD", $Pic1)) Local $hControl = ControlGetHandle($GUI_MAIN, "", $Pic1) GUICtrlSetData($Msgs, $hControl); check the handle is ok Local $hHBITMAP = _SendMessage($hControl, $BM_GETIMAGE, 0, 0) Local $hImage = _GDIPlus_BitmapCreateFromHBITMAP($hHBITMAP) _GDIPlus_ImageSaveToFile($hImage, @ScriptDir & "\LCD_Test.png") For $iRow = 0 To $iHeight - 1 Step 8 ; number of rows = 64 / 8 For $iX = 0 To $iWidth - 1 $bNum = 0 For $iY = 0 To 7 $cPixel = _GDIPlus_BitmapGetPixel($hImage, $iX, $iY + $iRow) If $cPixel <> 0 Then $bNum += (2 ^ $iY) EndIf Next _ArrayAdd($arPixel, Hex($bNum, 2)) Next Next _ArrayDisplay($arPixel, " test ") _GDIPlus_BitmapDispose($hImage) _GDIPlus_BitmapDispose($hHBITMAP) EndFunc ;==>Get_Pixels Func Draw_Text($sString = "") Local $hGraphic, $hBrush, $hFormat, _ $hFamily, $hFont, $tLayout, _ $aInfo, $hBitmap, $FontSize, _ $iWidth, $iHeight, $fontStyle, _ $hImage $iWidth = 128 $iHeight = 64 $FontSize = 11 $fontStyle = 1 $hImage = _GDIPlus_BitmapCreateFromScan0($iWidth, $iHeight, $GDIP_PXF01INDEXED) $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage) $hBrush = _GDIPlus_BrushCreateSolid(0xFFFFFFFF) _GDIPlus_GraphicsFillRect($hGraphic, 0, 0, $iWidth, $iHeight, $hBrush) _GDIPlus_BrushDispose($hBrush) $hFormat = _GDIPlus_StringFormatCreate() $hFamily = _GDIPlus_FontFamilyCreate("consolas") $hFont = _GDIPlus_FontCreate($hFamily, $FontSize, $fontStyle) $tLayout = _GDIPlus_RectFCreate($iWidth / 2 / 5, $iHeight / 3, 0, 0) $aInfo = _GDIPlus_GraphicsMeasureString($hGraphic, $sString, $hFont, $tLayout, $hFormat) $hBrush = _GDIPlus_BrushCreateSolid(0xFF000000) _GDIPlus_GraphicsDrawStringEx($hGraphic, $sString, $hFont, $aInfo[0], $hFormat, $hBrush) $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage) _GDIPlus_FontDispose($hFont) _GDIPlus_BrushDispose($hBrush) _GDIPlus_BitmapDispose($hImage) _GDIPlus_GraphicsDispose($hGraphic) _GDIPlus_FontFamilyDispose($hFamily) _GDIPlus_StringFormatDispose($hFormat) Return $hBitmap EndFunc ;==>Draw_Text -
Reading pixels from Pic control
Silent_Thunder replied to Silent_Thunder's topic in AutoIt GUI Help and Support
Thank you all for the support. thats what I did : Func Get_Pixels() Local $iWidth, $iHeight, $cPixel, $bNum $iWidth = 128 $iHeight = 64 ;Local $hGfx1 = _GDIPlus_GraphicsCreateFromHWND(ControlGetHandle($GUI_MAIN, "LCD", $Pic1)) Local $hControl = ControlGetHandle($GUI_MAIN, "", $Pic1) GUICtrlSetData($Msgs, $hControl); check the handle is ok Local $hHBITMAP = _SendMessage($hControl, $BM_GETIMAGE, 0, 0) Local $hImage = _GDIPlus_BitmapCreateFromHBITMAP($hHBITMAP) _GDIPlus_ImageSaveToFile($hImage, @ScriptDir & "\LCD_Test.png") For $iRow = 0 To $iHeight - 1 Step 8 ; number of rows = 64 / 8 For $iX = 0 To $iWidth - 1 $bNum = 0 For $iY = 0 To 7 $cPixel = _GDIPlus_BitmapGetPixel($hImage, $iX, $iY + $iRow) If $cPixel <> 0 Then $bNum += (2 ^ $iY) EndIf Next _ArrayAdd($arPixel, Hex($bNum, 2)) Next Next _ArrayDisplay($arPixel, " test ") _GDIPlus_BitmapDispose($hImage) _GDIPlus_BitmapDispose($hHBITMAP) EndFunc ;==>Get_Pixels still no success , the "LCD_Test.png" is not even created !!! there must be something I am missing , didn't know it is that hard to handle pic control -
Silent_Thunder changed their profile photo
-
Reading pixels from Pic control
Silent_Thunder replied to Silent_Thunder's topic in AutoIt GUI Help and Support
Thank you InunoTaishou for the quick reply my problem in this script is, the file saved "LCD_Export.png" is blank, while the pic have data in it, and of course the array filled with Zeros I'll try to modify it using _GDIPlus_BitmapLockBits , but I think it wont work since the data is not there, I just hoped to have a quick fix for that -
hi; I'm trying to read pixels from a 1bpp pic control, and I failed here is my failed code: Func Get_Pixels() Local $iWidth, $iHeight, $cPixel, $bNum $iWidth = 128 $iHeight = 64 Local $hGfx1 = _GDIPlus_GraphicsCreateFromHWND(ControlGetHandle($GUI_MAIN, "LCD", $Pic1)) Local $g_hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGfx1) _GDIPlus_ImageSaveToFile($g_hBitmap, @ScriptDir & "LCD_Export.png"); just testing For $iRow = 0 To $iHeight - 1 Step 8 ; number of rows = 8 For $iX = 0 To $iWidth - 1 $bNum = 0 For $iY = 0 To 7 $cPixel = _GDIPlus_BitmapGetPixel($g_hBitmap, $iX, $iY + $iRow) If $cPixel <> 0 Then $bNum += (2 ^ $iY) EndIf Next _ArrayAdd($arPixel, Hex($bNum, 2)) Next Next _ArrayDisplay($arPixel, " test ") EndFunc ;==>Get_Pixels $pic1 is the picture control I want to get its pixels. I just want to test if the pixel is on/off, and then generate a binary value for every 8 pixel above each other can any one help me plz, thanx