Что нового

Заменить все пиксели определенного цвета на прозрачный

passwd

Новичок
Сообщения
30
Репутация
0
Здравствуйте. Возможно ли средствами Autoit открыть картинку или сделав _ScreenCapture заменить весь зеленый(белый) фон на прозрачный цвет? Учитывая то, что на фоне находится объект, который заменят не нужно.
 
A

Alofa

Гость
Так?
Это для прикрепленного рисунка. Необходимо положить рядом со скриптом.

Код:
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <GDIPlus.au3>

_GDIPlus_Startup()
Local $iWidth = 601, $iHeight = 601, $sFileName = @ScriptDir & '\neuralc.png'

Local $hGUI = GUICreate('GDI+ Example (' & @ScriptName & ')', $iWidth, $iHeight, -1, -1, $WS_POPUP, $WS_EX_CONTROLPARENT)
GUISetBkColor(0x000000, $hGUI) ; Задаем Черный цвет фона GUI-окна.
GUISetState()

Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)
Local $hIA = _GDIPlus_ImageAttributesCreate()

; Посмотрите в справке, описание этой функции
_GDIPlus_ImageAttributesSetColorKeys($hIA, 0, True, 0x00DBDBDB, 0x00FFFFFF)

Local $hBitmap = _GDIPlus_BitmapCreateFromFile($sFileName)

_GDIPlus_GraphicsDrawImageRectRect($hGraphics, $hBitmap, 0, 0, $iWidth, $iHeight, 0, 0, $iWidth, $iHeight, $hIA)

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

_GDIPlus_ImageAttributesDispose($hIA)
_GDIPlus_GraphicsDispose($hGraphics)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_Shutdown()

Или вам сохранить нажно в файл?
 

Вложения

  • neuralc.png
    neuralc.png
    178.7 КБ · Просмотры: 19
Автор
passwd

passwd

Новичок
Сообщения
30
Репутация
0
Спасибо. Нужно сохранять в файл. Но я уже решил делать все эти действия через ImageMagic вот такой строкой:

convert "V:\1.png" -quality 100 -shave "10x10" -gravity center -extent "700x700" -transparent white "V:\123.png"

:smile:
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Пытаюсь на базе этого примера сделать все цвета, кроме чёрного, прозрачными (фактически заменить все цвета на цвет фона). Устанавливаю диапазон от 0xFF000001 до 0xFFFFFFFF. Но половина цветов не "заменяется" (картинка для экспериментов приложена). Как решить проблему?
Код:
#include <WindowsConstants.au3>
#include <GDIPlus.au3>

_GDIPlus_Startup()
Local $iWidth = 200, $iHeight = 200, $sFileName = "test.png"

$hGUI = GUICreate('GDI+ Example (' & @ScriptName & ')', $iWidth, $iHeight, -1, -1, $WS_POPUP, $WS_EX_CONTROLPARENT)
GUISetBkColor(0xFF00FF, $hGUI)
GUISetState()

$hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)
$hIA = _GDIPlus_ImageAttributesCreate()
_GDIPlus_ImageAttributesSetColorKeys($hIA, 0, True, 0xFF000001, 0xFFFFFFFF)
$hBitmap = _GDIPlus_BitmapCreateFromFile($sFileName)
_GDIPlus_GraphicsDrawImageRectRect($hGraphics, $hBitmap, 0, 0, $iWidth, $iHeight, 0, 0, $iWidth, $iHeight, $hIA)

Do
Until GUIGetMsg() = -3

_GDIPlus_ImageAttributesDispose($hIA)
_GDIPlus_GraphicsDispose($hGraphics)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_Shutdown()
 

Вложения

  • test.png
    test.png
    2.2 КБ · Просмотры: 13

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
_GDIPlus_ImageAttributesSetColorKeys($hIA, 0, True, 0xFF000000, 0xFFFFFFFF) так все ок
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
inververs
Так становятся прозрачными ВСЕ пиксели, а мне нужно чёрный оставить.

Добавлено:
Опытным путём выяснил, что диапазон задаётся не числом, а компонентами цвета. В результате, все цвета, у которых синего 0 не попадают в диапазон, т.к. я запрашиваю синего минимум 1. Такая же ситуация, если задать единицу красного или зелёного - все цвета с отсутствием данных составляющих в диапазон не попадут.

Добавлено:
Решил проблему циклом по каждому компоненту
Код:
#include <WindowsConstants.au3>
#include <GDIPlus.au3>

_GDIPlus_Startup()
Global $iWidth = 200, $iHeight = 200, $sFileName = "test.png"

$hGUI = GUICreate('GDI+ Example (' & @ScriptName & ')', $iWidth, $iHeight, -1, -1, $WS_POPUP, $WS_EX_CONTROLPARENT)
GUISetBkColor(0xFF00FF, $hGUI)
GUISetState()

$hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)
$hImage = _GDIPlus_BitmapCreateFromFile($sFileName)
$hIA = _GDIPlus_ImageAttributesCreate()

Global $aColors[] = [0x010000,0x000100,0x000001]
$hCurImg = _GDIPlus_BitmapCloneArea($hImage, 0, 0, $iWidth, $iHeight, $GDIP_PXF32PARGB)
_GDIPlus_ImageDispose($hImage)
For $i = 0 To 2
  $hBufImg = _GDIPlus_BitmapCreateFromScan0($iWidth, $iHeight)
  $hBufGraph = _GDIPlus_ImageGetGraphicsContext($hBufImg)
  _GDIPlus_ImageAttributesSetColorKeys($hIA, 0, True, $aColors[$i], 0xFFFFFF)
  _GDIPlus_GraphicsDrawImageRectRect($hBufGraph, $hCurImg, 0, 0, $iWidth, $iHeight, 0, 0, $iWidth, $iHeight, $hIA)
  _GDIPlus_ImageDispose($hCurImg)
  _GDIPlus_GraphicsDispose($hBufGraph)
  $hCurImg = _GDIPlus_BitmapCloneArea($hBufImg, 0, 0, $iWidth, $iHeight, $GDIP_PXF32PARGB)
  _GDIPlus_ImageDispose($hBufImg)
Next

; _GDIPlus_ImageSaveToFile($hCurImg, "img.png")
_GDIPlus_GraphicsDrawImage($hGraphics, $hCurImg, 0, 0)
_GDIPlus_ImageDispose($hCurImg)
_GDIPlus_GraphicsDispose($hGraphics)
_GDIPlus_ImageAttributesDispose($hIA)
_GDIPlus_Shutdown()

Do
Until GUIGetMsg() = -3
 
Верх