Что нового

В черно-белом изображении заменить цвет

musicstashall

Знающий
Сообщения
322
Репутация
7
Доброго.
Имеется изображение png в черно-белом исполнении, необходимо изменить черный на любой другой с сохранением сглаживания и прозрачности.

Код:
Func _GDIPlus_BitmapCreate($sPath, $iWidth, $iHeight, $iColor = 0)
    Local $hImage = _GDIPlus_ImageLoadFromFile($sPath)
    Local $hBitmap = _GDIPlus_ImageResize($hImage, $iWidth, $iHeight)
    If $iColor Then
        ; ??????
    EndIf
    Local $hBMP = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_BitmapDispose($hBitmap)
    Return $hBMP
EndFunc


Вероятно, это можно сделать с помощью _GDIPlus_ImageAttributesSetColorMatrix. Поясните пожалуйста, как это работает, я не догоняю:
Код:
Global Const $tagGDIPCOLORMATRIX = "float m[25];"    ; [5][5] matrix; [0][0] - red, [1][1] - green, [2][2] - blue; [3][3] - alpha, [4][4] - ~should~ be 1


Или может вариант с маской, что было бы правильнее.
 

Вложения

  • extension+48px-131985191617671038_512.png
    extension+48px-131985191617671038_512.png
    6 КБ · Просмотры: 7
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Код:
#include <GDIPlus.au3>

_GDIPlus_Startup()
$hImage = _GDIPlus_ImageLoadFromFile("111.png") ; чёрный

Global $iW = 512, $iH = 512
$hBitmap = _GDIPlus_BitmapCreateFromScan0($iW, $iH)
$hGraphics = _GDIPlus_ImageGetGraphicsContext($hBitmap)
$hIA = _GDIPlus_ImageAttributesCreate()
$tColorMatrix = _GDIPlus_ColorMatrixCreateTranslate(1, 0, 0) ; красный
;~ $tColorMatrix = _GDIPlus_ColorMatrixCreateTranslate(0, 1, 0) ; зелёный
;~ $tColorMatrix = _GDIPlus_ColorMatrixCreateTranslate(1, 1, 0) ; жёлтый
_GDIPlus_ImageAttributesSetColorMatrix($hIA, 0, True, $tColorMatrix)
_GDIPlus_GraphicsDrawImageRectRect($hGraphics, $hImage, 0, 0, $iW, $iH, 0, 0, $iW, $iH, $hIA)

_GDIPlus_ImageSaveToFile($hBitmap, "222.png")
_GDIPlus_ImageDispose($hIA)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_GraphicsDispose($hGraphics)
_GDIPlus_ImageAttributesDispose($hIA)
_GDIPlus_Shutdown()
 
Автор
M

musicstashall

Знающий
Сообщения
322
Репутация
7
Отлично! Благодарю.
А нет ли в GDIP функции, которая бы делала конвертацию параметра цвета из Hex в данное представление в виде десятичных значений?
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
По данным википедии gdiplus.dll содержит 600 функций. Может и такая есть... не знаю.
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
А нет ли в GDIP функции, которая бы делала конвертацию параметра цвета из Hex в данное представление
Можно конвертировать самостоятельно...
Код:
#include <GDIPlus.au3>
#include <Color.au3>

_GDIPlus_Startup()
$hImage = _GDIPlus_ImageLoadFromFile("111.png") ; чёрный

Global $iW = 512, $iH = 512
$hBitmap = _GDIPlus_BitmapCreateFromScan0($iW, $iH)
$hGraphics = _GDIPlus_ImageGetGraphicsContext($hBitmap)
$hIA = _GDIPlus_ImageAttributesCreate()

$iColor = 0x2D7D9A ; цвет
$aColor = _ColorGetRGB($iColor)
$aColor[0] /= 255
$aColor[1] /= 255
$aColor[2] /= 255
$tColorMatrix = _GDIPlus_ColorMatrixCreateTranslate($aColor[0], $aColor[1], $aColor[2])
_GDIPlus_ImageAttributesSetColorMatrix($hIA, 0, True, $tColorMatrix)
_GDIPlus_GraphicsDrawImageRectRect($hGraphics, $hImage, 0, 0, $iW, $iH, 0, 0, $iW, $iH, $hIA)

_GDIPlus_ImageSaveToFile($hBitmap, "222.png")
_GDIPlus_ImageDispose($hIA)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_GraphicsDispose($hGraphics)
_GDIPlus_ImageAttributesDispose($hIA)
_GDIPlus_Shutdown()
 
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Можно расширить на любой исходный цвет, не только чёрный
Код:
#include <GDIPlus.au3>
#include <Color.au3>

$iColorOrig = 0xFF0000 ; исходный цвет
$iColor = 0x2D7D9A ; необходимый цвет

$aColorOrig = _ColorGetRGB($iColorOrig)
$aColor = _ColorGetRGB($iColor)
$aColor[0] = ($aColor[0] - $aColorOrig[0]) / 255
$aColor[1] = ($aColor[1] - $aColorOrig[1]) / 255
$aColor[2] = ($aColor[2] - $aColorOrig[2]) / 255

Global $iW = 512, $iH = 512

_GDIPlus_Startup()
$hImage = _GDIPlus_ImageLoadFromFile("red.png")
$hBitmap = _GDIPlus_BitmapCreateFromScan0($iW, $iH)
$hGraphics = _GDIPlus_ImageGetGraphicsContext($hBitmap)
$hIA = _GDIPlus_ImageAttributesCreate()
$tColorMatrix = _GDIPlus_ColorMatrixCreateTranslate($aColor[0], $aColor[1], $aColor[2])
_GDIPlus_ImageAttributesSetColorMatrix($hIA, 0, True, $tColorMatrix)
_GDIPlus_GraphicsDrawImageRectRect($hGraphics, $hImage, 0, 0, $iW, $iH, 0, 0, $iW, $iH, $hIA)

_GDIPlus_ImageSaveToFile($hBitmap, "out.png")
_GDIPlus_ImageDispose($hIA)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_GraphicsDispose($hGraphics)
_GDIPlus_ImageAttributesDispose($hIA)
_GDIPlus_Shutdown()
 
Верх