Что нового

Объединение небольших картинок - в большие картинки формата А4

mv6677

Новичок
Сообщения
105
Репутация
0
Доброго времени суток, специалисты по autoit.
Хотел задать вопрос по работе с графическими форматами.
Вопрос - он не столько по графике, сколько по работе с файлами.

В общем есть несколько небольших картинок, они пронумерованы 1,2,3,4 и т.д.
И проблема в том, что эти небольшие картинки - нужно как-то собрать одну за другой - в большие jpg - которые имеют размер A4.
Чтобы потом распечатать легче было.

Как я понимаю - картинки просто как кубики - подкладываются одна под другую, выравниваясь по левой стороне.
Если следующая jpg-картинка уже не влезает, то начинает заполняться новая большая jpg с форматом А4.
Заполнение начинается сверху, выравнивается по левой стороне и идет вниз, пока не заполнит весь А4, а затем заполнение переходит на новый А4, пока мелкие картинки не закончатся.
(На приложенной фотографии видно - что на один А4 - поместилось 5 картинок, а 6,7 и 8 не поместились - поэтому они пойдут на другой А4.)

Как при помощи autoit произвести такое склеивание jpg ?
 

Вложения

  • 1-А4.jpg
    1-А4.jpg
    208.3 КБ · Просмотры: 4
  • Файлы jpg.rar
    494.9 КБ · Просмотры: 4

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Код:
;~ AutoIt Version: 3.3.14.5
;~ AutoIt Version: 3.3.14.5
#include <MsgBoxConstants.au3>
#include <WinAPIShPath.au3>
#include <GDIPlus.au3>
#include <File.au3>

_Example()

Func _Example()
    Local $sPath = FileSelectFolder("", @ScriptDir)
    If @error Then Exit

    Local $sPathOut = @ScriptDir & "\Out", $sFileOut = $sPathOut & "\1-А4.jpg", _
            $sBlank = "1-А4 -пустой.jpg", $sMask = "*.jpg|" & $sBlank

    Local $aFiles = _FileListToArrayRec($sPath, $sMask, $FLTAR_FILES, $FLTAR_NORECUR, $FLTAR_NOSORT, $FLTAR_FULLPATH)
    If @error Then Exit MsgBox($MB_TOPMOST + $MB_ICONERROR, Default, StringFormat('Файлы по шаблону не найдены -> "%s\%s"', $sPath, $sMask))

    Local $aFilesSort[$aFiles[0] + 1][2] = [[$aFiles[0]]]
    For $i = 1 To $aFiles[0]
        $aFilesSort[$i][0] = Number(StringRegExpReplace($aFiles[$i], "[^\d]", ""))
        $aFilesSort[$i][1] = $aFiles[$i]
    Next
    _ArraySort($aFilesSort, 0, 1)

    _GDIPlus_Startup()
    If Not FileExists($sPathOut) Then DirCreate($sPathOut)
    Local $hBlank = _GDIPlus_BitmapCreateFromFile($sPath & "\" & $sBlank)
    If @error Then
        MsgBox($MB_TOPMOST + $MB_ICONWARNING, Default, StringFormat('Файл для заполнения не найден -> "%s\%s", укажите размеры вручную', $sPath, $sBlank))
        Local $sSize = InputBox(Default, "Формат: ширина, высота", "816, 1056", "", -1, 125)
        If @error Then Exit

        Local $aSize = StringSplit($sSize, ",")
        If @error Then Exit MsgBox($MB_TOPMOST + $MB_ICONERROR, Default, "Неверный формат")
        $hBlank = _GDIPlus_BitmapCreateFromScan0(Int($aSize[1]), Int($aSize[2]))
    EndIf

    Local $iH = _GDIPlus_ImageGetHeight($hBlank), $iY = 0, $iStep = 0
    Local $hGraphics = _GDIPlus_ImageGetGraphicsContext($hBlank)
    _GDIPlus_GraphicsClear($hGraphics, 0xFFFFFFFF)
    For $i = 1 To $aFilesSort[0][0]
        $hBitmap = _GDIPlus_BitmapCreateFromFile($aFilesSort[$i][1])
        $iStep = _GDIPlus_ImageGetHeight($hBitmap)
        Select
            Case $iStep > $iH
                MsgBox($MB_TOPMOST + $MB_ICONERROR, Default, StringFormat('Изображение слишком большое -> "%s"', $aFilesSort[$i][1]))
            Case $iY + $iStep > $iH
                _GDIPlus_ImageSaveToFile($hBlank, _WinAPI_PathYetAnotherMakeUniqueName($sFileOut))
                _GDIPlus_GraphicsClear($hGraphics, 0xFFFFFFFF)
                $iY = 0
                ContinueCase
            Case Else
                _GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap, 0, $iY)
                $iY += $iStep
        EndSelect
        _GDIPlus_BitmapDispose($hBitmap)
    Next
    If $iY Then _GDIPlus_ImageSaveToFile($hBlank, _WinAPI_PathYetAnotherMakeUniqueName($sFileOut))
    _GDIPlus_BitmapDispose($hBlank)
    _GDIPlus_Shutdown()
    MsgBox($MB_TOPMOST + $MB_ICONINFORMATION, Default, "Обработка завершена")
    ShellExecute($sPathOut)
EndFunc   ;==>_Example
 
Последнее редактирование:
Автор
M

mv6677

Новичок
Сообщения
105
Репутация
0
Спасибо.
А можно как-то сделать, чтобы папка Out - создавалась бы сразу, сама по себе - рядом со скриптом ?

То есть чтобы скрипт меня дополнительно ни о чем не спрашивал - ни о размере формата А4, ни о выборе папки.
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Папка Out и так создается рядом со скриптом. Выбирается папка в которой хранятся изображения которые нужно склеить.
Это был пример, а если минимальные правки вам не по силам тогда это тема должна быть в разделе Стол заказов “Сделайте всё за меня”
 
  • Like
Реакции: Norm
Верх