Что нового

Прозрачный фон png файла при склейке

Maximysis

Новичок
Сообщения
2
Репутация
0
Доброго дня! Склевываю картинки в одну из многих. Не могу разобраться с прозрачным фоном. Подскажите куда копать...
Код:
#include <GDIPlus.au3>

if UBound($CmdLine) <> 3 Then
   exit
EndIf

$NewBitmapStr = $CmdLine[1]
$StrArr       = $CmdLine[2]

For $i = 1 To StringLen($StrArr)
    $aImgs = StringSplit($StrArr, ',', 2)
Next

_GDIPlus_Startup()

Dim $ahImage[UBound($aImgs)]

For $i = 0 To UBound($aImgs)-1
    $ahImage[$i] = _GDIPlus_ImageLoadFromFile($aImgs[$i])
Next

$iWidth  = _GDIPlus_ImageGetWidth($ahImage[0])
$iHeight = _GDIPlus_ImageGetHeight($ahImage[0])

$hNewBitmap  = _WinAPI_CreateBitmap($iWidth * UBound($aImgs), $iHeight, 1,32)
$hNewBitmap2 = _GDIPlus_BitmapCreateFromHBITMAP($hNewBitmap)
$hGraphic    = _GDIPlus_ImageGetGraphicsContext($hNewBitmap2)

_GDIPlus_GraphicsClear ($hGraphic, 0xFFFFFFFF); приходится заливать белым

For $i = 0 To UBound($ahImage)-1
    ($hGraphic,$ahImage[$i],$i*$iWidth,0,$iWidth,$iHeight)
    _GDIPlus_ImageDispose($ahImage[$i])

Next

_GDIPlus_ImageSaveToFile($hNewBitmap2, $NewBitmapStr)
_GDIPlus_GraphicsDispose($hGraphic)
_WinAPI_CloseHandle($hNewBitmap)
_GDIPlus_ImageDispose($hNewBitmap2)

_GDIPlus_Shutdown()

Exit
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
А у вас исходные картинки с прозрачным фоном? Если да, то замените _WinAPI_CreateBitmap на _GDIPlus_BitmapCreateFromScan0. Тогда у вас будет прозрачный hBitmap и функции _GDIPlus_BitmapCreateFromHBITMAP и _GDIPlus_GraphicsClear не понадобятся.

В этой строке какая функция пропущена?
Код:
($hGraphic,$ahImage[$i],$i*$iWidth,0,$iWidth,$iHeight)


Что находится в $StrArr? Если пути к файлам через запятую, то цикл по StringLen не нужен - достаточно одного вызова StringSplit.
 
Автор
M

Maximysis

Новичок
Сообщения
2
Репутация
0
А у вас исходные картинки с прозрачным фоном? Если да, то замените _WinAPI_CreateBitmap на _GDIPlus_BitmapCreateFromScan0. Тогда у вас будет прозрачный hBitmap и функции _GDIPlus_BitmapCreateFromHBITMAP и _GDIPlus_GraphicsClear не понадобятся.

В этой строке какая функция пропущена?
Код:
($hGraphic,$ahImage[$i],$i*$iWidth,0,$iWidth,$iHeight)


Что находится в $StrArr? Если пути к файлам через запятую, то цикл по StringLen не нужен - достаточно одного вызова StringSplit.
Спасибо огромное! Все получилось.
Вот код:

Код:
#include <GDIPlus.au3>

if UBound($CmdLine) <> 3 Then
   exit
EndIf

$NewBitmapStr = $CmdLine[1]
$aImgs = StringSplit($CmdLine[2],',',2)

_GDIPlus_Startup()

Dim $ahImage[UBound($aImgs)]

For $i = 0 To UBound($aImgs)-1
    $ahImage[$i] = _GDIPlus_ImageLoadFromFile($aImgs[$i])
Next

$iWidth  = _GDIPlus_ImageGetWidth($ahImage[0])
$iHeight = _GDIPlus_ImageGetHeight($ahImage[0])

$hNewBitmap = _GDIPlus_BitmapCreateFromScan0($iWidth * UBound($aImgs), $iHeight)
$hGraphic   = _GDIPlus_ImageGetGraphicsContext($hNewBitmap)

For $i = 0 To UBound($ahImage)-1

   _GDIPlus_GraphicsDrawImageRect($hGraphic,$ahImage[$i],$i*$iWidth,0,$iWidth,$iHeight)
   _GDIPlus_ImageDispose($ahImage[$i])

Next

_GDIPlus_ImageSaveToFile($hNewBitmap, $NewBitmapStr)

_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_ImageDispose($hNewBitmap)
_GDIPlus_Shutdown()

Exit
 
Верх