Что нового

Вывод уменьшенного изображения в GDI+

eus_deus

Новичок
Сообщения
90
Репутация
0
Доброго времени суток!
Голову сломал, пытаясь подобрать вариант... Никогда еще не пробовал именно эту библиотеку
Как вывести изображение не реального размера, а уменьшенного? В конечном итоге нужно выводить два изображения в разные контейнеры (изображения 400*400), склеивать их по горизонтали и выводить результат в третий контейнер, для просмотра перед сохранением. И без уменьшения не обойтись, в реальных размерах форма большая
Пока открываю только одно изображение, от чего и становится видно, что размеры, мягко говоря, резать бы раза в два. Масштабирование колесиком мыши не надо, просто уменьшение по коэффициенту

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

Global $Form1

_test()

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd


Func _test()
    $Form1 = GUICreate("GDI+", 980, 650, -1, -1)
    $Button1 = GUICtrlCreateButton("Button1", 16, 560, 217, 33)
    GUISetState(@SW_SHOW)
    _load_image()
EndFunc


Func _load_image()
    Local   $hBitmap, $hGraphic
    _GDIPlus_Startup ()
    $hBitmap = _GDIPlus_BitmapCreateFromFile(@ScriptDir&"\c529822_a_400x400.jpg")
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND ($Form1)
    _GDIPlus_GraphicsDrawImage ($hGraphic, $hBitmap, 500, 100)
    _GDIPlus_GraphicsDispose ($hGraphic)
    _GDIPlus_BitmapDispose ($hBitmap)
    _GDIPlus_ShutDown ()
EndFunc


В прикрепленном файле - само изображение
 

Вложения

  • c529822_a_400x400.jpg
    c529822_a_400x400.jpg
    43.8 КБ · Просмотры: 1

InnI

AutoIT Гуру
Сообщения
4,612
Репутация
1,298
См. в английской справке
Код:
_GDIPlus_ImageResize()
_GDIPlus_ImageScale()


А для вывода jpg проще использовать GuiCtrlCreatePic()
Код:
Func _test()
    $Form1 = GUICreate("GDI+", 980, 650, -1, -1)
    $Button1 = GUICtrlCreateButton("Button1", 16, 560, 217, 33)
    $Pic = GUICtrlCreatePic(@ScriptDir&"\c529822_a_400x400.jpg", 100, 100, 200, 200)
    GUISetState(@SW_SHOW)
    _load_image()
EndFunc
 
Автор
E

eus_deus

Новичок
Сообщения
90
Репутация
0
А для вывода jpg проще использовать GuiCtrlCreatePic()
Так и делал сначала, но... с него для последующей склейки изображение не получить...
Можно извратится, конечно, и писать имена где то в текстовых метках, но для склейки то все равно придется использовать GDI+
 
Автор
E

eus_deus

Новичок
Сообщения
90
Репутация
0
Inni, нет. Уменьшенные только отображать
 

InnI

AutoIT Гуру
Сообщения
4,612
Репутация
1,298
И в чём проблема? Создайте две переменные с путями к файлам: либо укажите прямо в скрипте, либо получите пути из диалога открытия файла. Теперь для отображения используйте Pic с этими переменными, а для склеивания GDI+, опять же с этими переменными.
 
Последнее редактирование:
Автор
E

eus_deus

Новичок
Сообщения
90
Репутация
0
Проблему я описал - из за размеров изображений большая форма.
Вы натолкнули меня на правильный путь с английской справкой, за что вам огромная благодарность
Буду плавать далее
 

InnI

AutoIT Гуру
Сообщения
4,612
Репутация
1,298
Пример без изменения размеров исходных файлов
Код:
#include <GUIConstantsEx.au3>
#include <GDIPlus.au3>

$File1 = @ScriptDir & "\1_400x400.jpg"
$File2 = @ScriptDir & "\2_400x400.jpg"
$File3 = @ScriptDir & "\3_800x400.jpg" ; склеенный

$GUI = GUICreate("", 800, 250)
$Btn = GUICtrlCreateButton("Склеить", 5, 215, 400, 30)
$Pic1 = GUICtrlCreatePic($File1, 0, 0, 200, 200)
$Pic2 = GUICtrlCreatePic($File2, 200, 0, 200, 200)
$Pic3 = GUICtrlCreatePic("", 400, 0, 400, 200)
GUISetState()

While 1
  Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
      Exit
    Case $Btn
      _Join()
  EndSwitch
WEnd

Func _Join()
  Local $hImg1, $hImg2, $hImg3, $hGraph
  _GDIPlus_Startup()
  $hImg1 = _GDIPlus_ImageLoadFromFile($File1)
  $hImg2 = _GDIPlus_ImageLoadFromFile($File2)
  $hImg3 = _GDIPlus_BitmapCreateFromScan0(800, 400)
  $hGraph = _GDIPlus_ImageGetGraphicsContext($hImg3)
  _GDIPlus_GraphicsDrawImage($hGraph, $hImg1, 0, 0)
  _GDIPlus_GraphicsDrawImage($hGraph, $hImg2, 400, 0)
  _GDIPlus_ImageSaveToFile($hImg3, $File3)
  _GDIPlus_GraphicsDispose($hGraph)
  _GDIPlus_BitmapDispose($hImg1)
  _GDIPlus_BitmapDispose($hImg2)
  _GDIPlus_BitmapDispose($hImg3)
  _GDIPlus_ShutDown()
  GUICtrlSetImage($Pic3, $File3)
EndFunc
 
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4,612
Репутация
1,298
Создаёт новый битмап размером в два исходных, куда копируются загруженные для слияния (см. англ. справку).
 
Автор
E

eus_deus

Новичок
Сообщения
90
Репутация
0
Маленько переписал функцию
Код:
[URL='https://autoit-script.ru/docs/keywords/func.htm']Func[/URL] _Join()
    Local $hImg1, $hImg2, $hImg3, $hGraph, $hGraphic, $hBitmap_scaled
    _GDIPlus_Startup()
    $hImg1 = _GDIPlus_ImageLoadFromFile(StringSplit($aNames_images, '|')[1])
    $hImg2 = _GDIPlus_ImageLoadFromFile(StringSplit($aNames_images, '|')[2])
    $hImg3 = _GDIPlus_BitmapCreateFromScan0(800, 400)
    $hGraph = _GDIPlus_ImageGetGraphicsContext($hImg3)
    _GDIPlus_GraphicsDrawImage($hGraph, $hImg1, 0, 0)
    _GDIPlus_GraphicsDrawImage($hGraph, $hImg2, 400, 0)
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND ($Form1)
    $hBitmap_scaled = _GDIPlus_ImageResize($hImg3, 400, 200)
    _GDIPlus_GraphicsDrawImage ($hGraphic, $hBitmap_scaled, 400, 350)
    _GDIPlus_GraphicsDispose($hGraph)
    _GDIPlus_GraphicsDispose ($hGraphic)
    _GDIPlus_BitmapDispose($hImg1)
    _GDIPlus_BitmapDispose($hImg2)
    _GDIPlus_BitmapDispose($hImg3)
    _GDIPlus_BitmapDispose ($hBitmap_scaled)
    _GDIPlus_ShutDown()
EndFunc

Вывод теперь через GDI, чтобы сделать потом отдельно функцию сохранения результата, если он устраивает
Но сложная библиотека для понимания все таки
 
Автор
E

eus_deus

Новичок
Сообщения
90
Репутация
0
Уверен, что это можно обойти. Но пока у меня там другая, более весомая проблема
 
Верх