Что нового

Наложение частично прозрачного png на файл jpg

Сообщения
13
Репутация
0
Здравствуйте. Подскажите как должен выглядеть AutoIt-скрипт по наложению водяного знака.

В одной папке лежат файлы "1.jpg" и "Рисунок7.png" (с поддержкой прозрачности).
Эти два рисунка - одного размера.

Как скриптом наложить "Рисунок7.png", на "1.jpg" ?
( чтобы в результате получилось как бы наложение водяного знака.)

Есть вот такой код... но он - отчего-то не работает.
Код:
#Include <GDIPlus.au3>

_Main()

Func _Main()
    Local $hImage1, $hImage2, $hGraphic
    _GDIPlus_Startup()
    $hImage1 = _GDIPlus_BitmapCreateFromFile(@ScriptDir & '\1.jpg')
    $hImage2 = _GDIPlus_BitmapCreateFromFile(@ScriptDir & '\Рисунок7.png')
    $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage1)
    _GDIPlus_GraphicsDrawImage($hGraphic, $hImage2, 0, 0)
    _GDIPlus_ImageSaveToFile($hImage1, @ScriptDir & '\3.jpg')
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_ImageDispose($hImage1)
    _GDIPlus_ImageDispose($hImage2)
    _GDIPlus_Shutdown()
EndFunc   ;==>_Main
 
Автор
А
Сообщения
13
Репутация
0
Это нормальный рабочий . Что конкретно не работает?

Собственно сам скрипт и не работает.
Есть картинка 1.jpg
Есть картинка 2.png

Запускаю скрипт.
Скрипт производит какие-то действия и создает файл 3.jpg ... который является точной копией файла 1.jpg (то есть без водяных знаков)

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

InnI

AutoIT Гуру
Сообщения
4,650
Репутация
1,320
АлексейАльтман [?]
Есть картинка 2.png
А в скрипте у вас "Рисунок7.png" ;)

создает файл 3.jpg ... который является точной копией файла 1.jpg
Вероятно, проблемы именно с png файлом. Либо он не найден, либо он НЕ png.
Добавил проверки на ошибки. Посмотрите, какое сообщение появится
Код:
#Include <GDIPlus.au3>

_Main()
MsgBox(0x40000, "", "Ошибок не обнаружено")

Func _Main()
    Local $hImage1, $hImage2, $hGraphic
    _GDIPlus_Startup()
    If @error Then Exit MsgBox(0x40000, "", "Ошибка инициализации GDIPlus")
    $hImage1 = _GDIPlus_BitmapCreateFromFile(@ScriptDir & '\1.jpg')
    If @error Then Exit MsgBox(0x40000, "", "Ошибка загрузки файла 1.jpg")
    $hImage2 = _GDIPlus_BitmapCreateFromFile(@ScriptDir & '\Рисунок7.png')
    If @error Then Exit MsgBox(0x40000, "", "Ошибка загрузки файла Рисунок7.png")
    $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage1)
    If @error Then Exit MsgBox(0x40000, "", "Ошибка создания объекта Graphic")
    _GDIPlus_GraphicsDrawImage($hGraphic, $hImage2, 0, 0)
    If @error Then Exit MsgBox(0x40000, "", "Ошибка отрисовки image2")
    _GDIPlus_ImageSaveToFile($hImage1, @ScriptDir & '\3.jpg')
    If @error Then Exit MsgBox(0x40000, "", "Ошибка сохранения")
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_ImageDispose($hImage1)
    _GDIPlus_ImageDispose($hImage2)
    _GDIPlus_Shutdown()
EndFunc   ;==>_Main
 
Автор
А
Сообщения
13
Репутация
0
Либо он не найден, либо он НЕ png.

Файл лежит на месте.
Имеет название Рисунок7.png
Является именно png (не просто png, а png с поддержкой прозрачности. Я эту уже проверил).
Последний скрипт выдает сообщение : "Ошибок не обнаружено".

После срабатывания - последний скрипт выдает точную копию файла 1.jpg (только с названием 3.jpg)
Однако получаемый файл 3.jpg (будучи точной копией файла 1.jpg) - имеет размер несколько меньший (в килобайтах).
 

InnI

AutoIT Гуру
Сообщения
4,650
Репутация
1,320
Какие сообщения выведет этот скрипт?
Код:
#Include <GDIPlus.au3>

_GDIPlus_Startup()
$hImage1 = _GDIPlus_BitmapCreateFromFile(@ScriptDir & '\1.jpg')
If @error Then Exit MsgBox(0x40000, "", "Ошибка загрузки файла 1.jpg")
$hImage2 = _GDIPlus_BitmapCreateFromFile(@ScriptDir & '\Рисунок7.png')
If @error Then Exit MsgBox(0x40000, "", "Ошибка загрузки файла Рисунок7.png")
MsgBox(0x40000, "Image1", _GDIPlus_ImageGetHorizontalResolution($hImage1) & ":" & _GDIPlus_ImageGetVerticalResolution($hImage1))
MsgBox(0x40000, "Image2", _GDIPlus_ImageGetHorizontalResolution($hImage2) & ":" & _GDIPlus_ImageGetVerticalResolution($hImage2))
_GDIPlus_ImageDispose($hImage1)
_GDIPlus_ImageDispose($hImage2)
_GDIPlus_Shutdown()

Архив с файлами можете приложить?
 
Автор
А
Сообщения
13
Репутация
0
InnI , сейчас скрипт выдал два сообщения:
Первое сообщение 96:96
Второе сообщение 1000:1000

(Насчет архива с файлами я бы приложил, но на этом сайте - действует запрет на прикрепление файлов к сообщению.
Выдает ошибку, что запрещено прикреплять файлы "только для чтения".
Поэтому приложить файлы - сайт autoit-script.ru запрещает.)
 

InnI

AutoIT Гуру
Сообщения
4,650
Репутация
1,320
АлексейАльтман [?]
Второе сообщение 1000:1000
Пробуйте
Код:
#Include <GDIPlus.au3>

_Main()
MsgBox(0x40000, "", "Ошибок не обнаружено")

Func _Main()
    Local $hImage1, $hImage2, $hGraphic
    _GDIPlus_Startup()
    If @error Then Exit MsgBox(0x40000, "", "Ошибка инициализации GDIPlus")
    $hImage1 = _GDIPlus_BitmapCreateFromFile(@ScriptDir & '\1.jpg')
    If @error Then Exit MsgBox(0x40000, "", "Ошибка загрузки файла 1.jpg")
    _GDIPlus_BitmapSetResolution($hImage1, 96, 96)
    If @error Then Exit MsgBox(0x40000, "", "Ошибка установки DPI для 1.jpg")
    $hImage2 = _GDIPlus_BitmapCreateFromFile(@ScriptDir & '\Рисунок7.png')
    If @error Then Exit MsgBox(0x40000, "", "Ошибка загрузки файла Рисунок7.png")
    _GDIPlus_BitmapSetResolution($hImage2, 96, 96)
    If @error Then Exit MsgBox(0x40000, "", "Ошибка установки DPI для Рисунок7.png")
    $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage1)
    If @error Then Exit MsgBox(0x40000, "", "Ошибка создания объекта Graphic")
    _GDIPlus_GraphicsDrawImage($hGraphic, $hImage2, 0, 0)
    If @error Then Exit MsgBox(0x40000, "", "Ошибка отрисовки image2")
    _GDIPlus_ImageSaveToFile($hImage1, @ScriptDir & '\3.jpg')
    If @error Then Exit MsgBox(0x40000, "", "Ошибка сохранения")
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_ImageDispose($hImage1)
    _GDIPlus_ImageDispose($hImage2)
    _GDIPlus_Shutdown()
EndFunc   ;==>_Main

Если у вас не последняя версия AutoIt, то добавьте в конец скрипта эту функцию
Код:
; #FUNCTION# ====================================================================================================================
; Author ........: Authenticity
; Modified ......: Eukalyptus
; ===============================================================================================================================
Func _GDIPlus_BitmapSetResolution($hBitmap, $fDpiX, $fDpiY)
	Local $aResult = DllCall($__g_hGDIPDll, "int", "GdipBitmapSetResolution", "handle", $hBitmap, "float", $fDpiX, "float", $fDpiY)
	If @error Then Return SetError(@error, @extended, False)
	If $aResult[0] Then Return SetError(10, $aResult[0], False)
	Return True
EndFunc   ;==>_GDIPlus_BitmapSetResolution
 
Автор
А
Сообщения
13
Репутация
0
InnI , Первый скрипт выдавал ошибку.
Но вот когда добавил второй скрипт - все заработало.

В общем - спасибо вам огромное.
И просто низкий поклон.
 
Верх