Jump to content

BMP to PNG with transparent color


Go to solution Solved by UEZ,

Recommended Posts

I'd like to load a BMP file then change chosen color (0xFF00FF) to transparent and save it as PNG file. I'm using a code from other thread. I've modified it a little, but it still doesn't work.

My program displays image with transparent color correctly, however saves a black image file.

#include <Constants.au3>
#include <WinAPIEx.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <ScreenCapture.au3>
#include <WinAPI.au3>


Global Const $STM_SETIMAGE = 0x0172
Global Const $STM_GETIMAGE = 0x0173

$hForm = GUICreate('MyGUI', 400, 400)
$Pic = GUICtrlCreatePic('', 50, 50, 144, 87)
$hPic = GUICtrlGetHandle(-1)

_GDIPlus_Startup()

$hDstDC = _WinAPI_CreateCompatibleDC(0)
$hBitmap = _WinAPI_CreateSolidBitmap(0, _WinAPI_GetSysColor($COLOR_3DFACE), 144, 87, 0)
$hDstSv = _WinAPI_SelectObject($hDstDC, $hBitmap)
$hSrcDC = _WinAPI_CreateCompatibleDC(0)
$hImg = _WinAPI_LoadImage(0, @ScriptDir & '\piclvq.bmp', $IMAGE_BITMAP, 0, 0, $LR_LOADFROMFILE)
$hSrcSv = _WinAPI_SelectObject($hSrcDC, $hImg)
_WinAPI_TransparentBlt($hDstDC, 0, 0, 144, 87, $hSrcDC, 0, 0, 144, 87, 0xFF00FF)


$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hForm)
$hImage = _GDIPlus_BitmapCreateFromGraphics(144, 87, $hGraphic)

; Save resultant image
_GDIPlus_ImageSaveToFile($hImage, "My_transparent_image.png")

_WinAPI_SelectObject($hDstDC, $hDstSv)
_WinAPI_DeleteDC($hDstDC)
_WinAPI_SelectObject($hSrcDC, $hSrcSv)
_WinAPI_DeleteDC($hSrcDC)

_WinAPI_DeleteObject($hImg)
_WinAPI_DeleteObject(_SendMessage($hPic, $STM_SETIMAGE, $IMAGE_BITMAP, $hBitmap))
$hPic = _SendMessage($hPic, $STM_GETIMAGE)
If $hPic <> $hBitmap Then
    _WinAPI_DeleteObject($hBitmap)
EndIf

GUISetState()

Do
Until GUIGetMsg() = -3

piclvq.bmp

Edited by Shanheavel
Link to comment
Share on other sites

  • Solution

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Link to comment
Share on other sites

Yeah, it works! You saved me a lot of time. I've just replaced screen capturing with making bitmap from a file.

Here is full working code:

#include <ScreenCapture.au3>

_GDIPlus_Startup()
Global $iWidth = 144, $iHeight = 87
Global $hBitmap_GDIPlus = _GDIPlus_BitmapCreateFromFile("piclvq.bmp")
Global $hBitmap_Result = _GDIPlus_BitmapCreateFromScan0($iWidth, $iHeight)
Global $hBitmap_Result_Ctxt = _GDIPlus_ImageGetGraphicsContext($hBitmap_Result)

Global $aRemapTable[2][2]
$aRemapTable[0][0] = 1
$aRemapTable[1][0] = 0xFFFF00FF ;Farbe, die Transparent gemacht werden soll

Global $hIA = _GDIPlus_ImageAttributesCreate()
_GDIPlus_ImageAttributesSetRemapTable($hIA, 1, True, $aRemapTable)
_GDIPlus_GraphicsDrawImageRectRect($hBitmap_Result_Ctxt, $hBitmap_GDIPlus, 0, 0, $iWidth, $iHeight, 0, 0, $iWidth, $iHeight, $hIA)
_GDIPlus_ImageSaveToFile($hBitmap_Result, @ScriptDir & "\Result.png")

_GDIPlus_GraphicsDispose($hBitmap_Result_Ctxt)
_GDIPlus_BitmapDispose($hBitmap_GDIPlus)
_GDIPlus_BitmapDispose($hBitmap_Result)
_GDIPlus_ImageAttributesDispose($hIA)
_GDIPlus_Shutdown()

ShellExecute(@ScriptDir & "\Result.png")

Func _GDIPlus_ImageAttributesSetRemapTable($hImageAttributes, $iColorAdjustType = 0, $fEnable = False, $aColorMap = 0)
    Local $iI, $iCount, $tColorMap, $aResult
    If IsArray($aColorMap) And UBound($aColorMap) > 1 Then
        $iCount = $aColorMap[0][0]
        $tColorMap = DllStructCreate("uint ColorMap[" & $iCount * 2 & "]")
        For $iI = 1 To $iCount
            $tColorMap.ColorMap((2 * $iI - 1)) = $aColorMap[$iI][0]
            $tColorMap.ColorMap((2 * $iI)) = $aColorMap[$iI][1]
        Next
        $aResult = DllCall($__g_hGDIPDll, "int", "GdipSetImageAttributesRemapTable", "handle", $hImageAttributes, "int", $iColorAdjustType, "int", $fEnable, "int", $iCount, "struct*", $tColorMap)
        If @error Then Return SetError(@error, @extended, False)
        If $aResult[0] Then Return SetError(10, $aResult[0], False)
        Return True
    EndIf
    Return SetError(11, 0, False)
EndFunc   ;==>_GDIPlus_ImageAttributesSetRemapTable

Danke! 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...