Показать полную графическую версию : [решено] Задача по автоматизации. Склейка 2х jpg файлов
Добрый день.
Есть более тысячи файлов изображений. Размер маленький, каждый 400-600кб. Файлы одинаковые - ширина, высота, ориентация (книжная) и битность (серый 8bit). Имена файлов последовательно (2011_0001, 2011_0002 ... и т.д.). Склейка - по узкой стороне.
Требуется "взять" первый (нечетный) и снизу приклеить второй (четный) и сохранить в файл 2011_s***. Вместо звездочек нарастающий номер. Идеальный вариант: указать 2 папки - откуда брать и куда складывать. Работа разовая - ПО не критично, поставим, сделаем и снесем.
Какие уважаемое общество может предложить варианты.
с ImageMagick (http://imagemagick.org/script/index.php) идет утилита convert.exe, она может объединять файлы
а bat-файл помогут написать здесь http://forum.oszone.net/forum-102.html
irvicon, попробуйте так:
Option Explicit
Dim objFSO
Dim objFile
Dim objRegExp
Dim strFileSource2
Dim strFileDest
Dim objImageFileSource1
Dim objImageFileSource2
Dim objImageFileWork
Dim objImageProcess
Dim lngCount
If WScript.Arguments.Count = 2 Then
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
If objFSO.FolderExists(WScript.Arguments.Item(0)) Then
If objFSO.FolderExists(WScript.Arguments.Item(1)) Then
Set objRegExp = WScript.CreateObject("VBScript.RegExp")
With objRegExp
.IgnoreCase = True
.Pattern = "2011_\d{3}[13579]{1}\.jpg"
End With
lngCount = 0
For Each objFile In objFSO.GetFolder(WScript.Arguments.Item(0)).Files
If objRegExp.Test(objFile.Name) Then
lngCount = lngCount + 1
WScript.Echo "Iteration #" & CStr(lngCount)
WScript.Echo " Source #1: " & objFile.Path
strFileSource2 = objFSO.BuildPath( _
objFile.ParentFolder, _
"2011_" & Right("0000" & CStr(CLng(Right(objFSO.GetBaseName(objFile.Name), 4)) + 1), 4) & "." & _
objFSO.GetExtensionName(objFile.Name) _
)
WScript.Echo " Source #2: " & strFileSource2
If objFSO.FileExists(strFileSource2) Then
Set objImageFileSource1 = WScript.CreateObject("WIA.ImageFile")
Set objImageFileSource2 = WScript.CreateObject("WIA.ImageFile")
Set objImageProcess = WScript.CreateObject("WIA.ImageProcess")
objImageFileSource1.LoadFile objFile.Path
objImageFileSource2.LoadFile strFileSource2
With objImageProcess
' Создаём «болванку» итогового изображения посредством
' масштабирования первого изображения до нужного размера
' Это работает быстрее, нежели формирование его вручную
.Filters.Add .FilterInfos("Scale").FilterID
With .Filters.Item(.Filters.Count).Properties
' По первому изображению определяем, где у него «узкая» сторона
' В ту сторону и увеличиваем изображение, влево или вниз
If objImageFileSource1.Width / objImageFileSource1.Height >= 1 Then
.Item("MaximumWidth") = objImageFileSource1.Width + objImageFileSource2.Width
.Item("MaximumHeight") = objImageFileSource1.Height
Else
.Item("MaximumWidth") = objImageFileSource1.Width
.Item("MaximumHeight") = objImageFileSource1.Height + objImageFileSource2.Height
End If
.Item("PreserveAspectRatio") = False
End With
' Получаем «болванку» изображения
Set objImageFileWork = .Apply(objImageFileSource1)
.Filters.Remove .Filters.Count
' Накладываем на полученное изображение первое изображение
.Filters.Add .FilterInfos("Stamp").FilterID
With .Filters.Item(.Filters.Count).Properties
.Item("ImageFile") = objImageFileSource1
.Item("Left") = 0
.Item("Top") = 0
End With
' Накладываем на полученное изображение второе изображение
.Filters.Add .FilterInfos("Stamp").FilterID
With .Filters.Item(.Filters.Count).Properties
.Item("ImageFile") = objImageFileSource2
' По первому изображению определяем, где у него «узкая» сторона
' К той стороне и прикладываем второе изображение, слева или снизу
If objImageFileSource1.Width / objImageFileSource1.Height >= 1 Then
.Item("Left") = objImageFileSource1.Width
.Item("Top") = 0
Else
.Item("Left") = 0
.Item("Top") = objImageFileSource1.Height
End If
End With
' Получаем итоговое изображение
Set objImageFileWork = .Apply(objImageFileWork)
.Filters.Remove .Filters.Count
.Filters.Remove .Filters.Count
End With
' Сохраняем полученное итоговое изображение
strFileDest = WScript.Arguments.Item(1) & "\2011_s" & Right("0000" & CStr(lngCount), 4) & "." & objImageFileWork.FileExtension
If objFSO.FileExists(strFileDest) Then
objFSO.DeleteFile strFileDest, True
End If
objImageFileWork.SaveFile strFileDest
WScript.Echo " Destination: " & strFileDest
WScript.Echo
Else
WScript.Echo " Can't find odd source file [" & strFileSource2 & "]"
WScript.Echo
End If
Else
' Nothing to do
End If
Next
Set objImageProcess = Nothing
Set objImageFileSource1 = Nothing
Set objImageFileSource2 = Nothing
Set objRegExp = Nothing
Else
WScript.Echo "Can't find destination folder [" & WScript.Arguments.Item(1) & "]"
End If
Else
WScript.Echo "Can't find source folder [" & WScript.Arguments.Item(0) & "]"
End If
Set objFSO = Nothing
Else
WScript.Echo "Usage: " & WScript.ScriptName & " <Source folder> <Destination folder>"
End If
WScript.Quit
Код сохранить в файл с кодировкой ANSI (win-1251) с расширением «.vbs». Исполнять, указав папку-источник и папку назначения аргументами скрипта. Например:
cscript.exe "e:\Песочница\0082\Script.vbs" "e:\Песочница\0082\Source" "e:\Песочница\0082\Destination"
Iteration #1
Source #1: E:\Песочница\0082\Source\2011_0001.jpg
Source #2: E:\Песочница\0082\Source\2011_0002.jpg
Destination: E:\Песочница\0082\Destination\2011_s0001.jpg
Iteration #2
Source #1: E:\Песочница\0082\Source\2011_0003.jpg
Source #2: E:\Песочница\0082\Source\2011_0004.jpg
Destination: E:\Песочница\0082\Destination\2011_s0002.jpg
Iteration #3
Source #1: E:\Песочница\0082\Source\2011_0005.jpg
Source #2: E:\Песочница\0082\Source\2011_0006.jpg
Destination: E:\Песочница\0082\Destination\2011_s0003.jpg
Я исполняю скрипты под консольным «cscript.exe» (я указал на это обстоятельство в примере; более того — «cscript.exe» у меня назначен как стандартный сервер сценариев [вместо «wscript.exe»]). Это даёт такое преимущество, как возможность вывода текста, индикаторы прогресса в консоли, простое перенаправление вывода в файл и т.п.
Ну, и работаю я под Far Manager'ом, где вывод консольной программы сразу можно перенаправить в его вьюер, або в редактор.
irvicon, попробуйте так: »
Сегодня попробую.
irvicon, попробуйте так »
Работает! :) Большое спасибо.
Куда слать пиво?)
Куда слать пиво?) »
Спросите у Администрации. Может им нужно ;).
irvicon, попробуйте так:
читать дальше » »
Прекрасное решение, мощь не уступающая линукс консоли, но менее понятная большинству.
Большое спасибо за предложенный вариант, немного допилив использовал и в своих целях.
:clapping:
А с чем может быть связана ошибка "Could not locate automation class named "WIA.ImageFile"" при запуске указанного выше VBS скрипта?
И каким образом там вообще осуществляется склейка изображений, с пережатием или без?
Собственно был бы очень благодарен если подскажите решение по объединению двух JPEG файлов (одинаковая ширина и высота, а так же параметры сжатия) в один, желательно lossless.
А так же прошу подсказать, что необходимо поправить в скрипте, если правому файлу "***.jpg" соответсвует левый "***_.jpg" (имя файла произвольной длинны).
А с чем может быть связана ошибка "Could not locate automation class named "WIA.ImageFile"" при запуске указанного выше VBS скрипта? »
С отсутствием данного объекта Automation. На какой ОС была попытка исполнить скрипт?
И каким образом там вообще осуществляется склейка изображений, с пережатием или без? »
Полагаю, что первое. Точный ответ может дать только команда разработчиков из Microsoft.
Собственно был бы очень благодарен если подскажите решение по объединению двух JPEG файлов (одинаковая ширина и высота, а так же параметры сжатия) в один, »
Излагайте детали. В подробностях.
…желательно lossless. »
А это возможно в принципе?! При любых значениях ширины и высоты?
А так же прошу подсказать, что необходимо поправить в скрипте, если правому файлу "***.jpg" соответсвует левый "***_.jpg" (имя файла произвольной длинны). »
Например?
С отсутствием данного объекта Automation. »
Для работы скрипта нужен дополнительный софт?
На какой ОС была попытка исполнить скрипт? »
Windows XP SP3 x86 RU
Излагайте детали. В подробностях. »
Есть парочка сотен (до тысячи) JPEG картинок в с вое время нарезанных в Фотошоп с одинаковым размером (230х153 пикселей) и сжатыми с одними параметрами (если не ошибаюсь Baseline:Optimized 8/12)
В связи с оптимизацией веб-страниц на которых они располагаются встал вопрос с объединением пар изображений в одно.
Например? »
1.jpg и соответствующая ему пара 1_.jpg объединить например в 1_out.jpg
0909.jpg и соответствующая ему пара 0909_.jpg в 0909_out.jpg
Хотел попробовать приведенный здесь скрипт (т.к. ввариант с "входящей" и "исходящей" папками тоже подходит), но почти сразу появилась вышеуказанная ошибка.
А это возможно в принципе?! »
Всемирный источник знаний однозначно не отвечает на этот вопрос...
Вот пару найденных мной обсуждений данного вопроса:
http://www.programmersforum.ru/showthread.php?t=245229
http://forum.ru-board.com/topic.cgi?forum=36&topic=1429
http://forum.ixbt.com/topic.cgi?id=20:15554
http://sasgis.org/mantis/view.php?id=1203
В ходе поисков так же нашлась и эта когда-то решенная тема.
Для работы скрипта нужен дополнительный софт? »
Описания:
Windows Image Acquisition Automation Layer (http://msdn.microsoft.com/en-us/library/ms630827(VS.85).aspx)
Windows Image Acquisition (WIA) (Windows) (https://msdn.microsoft.com/en-us/library/windows/desktop/ms630368%28v=vs.85%29.aspx)
Ссылка на загрузку библиотеки «Windows Image Acquisition Library v2.0» и SDK: … Упс, убрали с сайта Microsoft. Попробую вечером посмотреть, что можно сделать.
Спасибо за объяснения, буду пробовать.
Кстати, если я правильно определил и нашел, то скачать можно по этой ссылке:
http://vbnet.mvps.org/files/updates/wiaautsdk.zip
Кстати, если я правильно определил и нашел, »
Правильно. Это оно. Я сейчас загрузил архив и сравнил с имеющимся у меня в наличии — полностью совпадает. Описание установки «ручками» приведено в файле «ReadMe.txt» внутри архива.
Выложите для экспериментов штуки три-четыре пары изображений на RGhost, упаковав их в архив.
Теперь все сработало, но видимо все же придется искать другое решение.
С таким уровнем компрессии по умолчанию - мне никак не подходит.
Жаль что lossless склейка JPG похоже до ума так и не доведена.
Я так до конца и не понял, может ли эта утилита соединять.
http://jpegclub.org/jpegtran/
Все попытки её вызова так ни к ему и не привели, у меня постоянно пишет какую-нибудь ошибку синтаксиса командной строки.
Цитата Iska:
Выложите для экспериментов штуки три-четыре пары изображений на RGhost, упаковав их в архив. »
http://rghost.ru/8WhBJn5t8
pzh2393, это те реальные файлы, что требуется объединить? Я что-то сомневаюсь. Как Вы их ранее могли «нарезать» из одной картинки, если это и есть одна и та же картинка, только разных форматах?
Так же не представляю, как Вы вообще предполагали без пересжатия объединить изображения в разных форматах:
Common
File name : E:\Песочница\0427\sample\woman.jpg
File size : 6542 bytes
Image type : image/jpeg
Width : 153 px
Height : 200 px
Pixel format : 8 bpp, indexed
Color space : Grayscale
EXIF
GDI+.Luminance Table : 10
и
Common
File name : E:\Песочница\0427\sample\woman_.jpg
File size : 9044 bytes
Image type : image/jpeg
Width : 153 px
Height : 200 px
Pixel format : 24 bpp, RGB
Color space : YCBCR
EXIF
GDI+.Luminance Table : 10
GDI+.Chrominance Table : 11
Поясните этот вопрос.
Цитата Iska:
это те реальные файлы, что требуется объединить? Я что-то сомневаюсь. »
Да, вы меня подловили - это не именно те файлы.
Дело в том, что руководитель категорически запретил выкладывать какие-либо файлы проекта, пришлось выкручиваться.
Мне, как дизайнеру, не пришло в голову, что могут быть такие технические отличия, мне просто было так проще обозначить отличия.
Суть "истинных" файлов почти такая же - два состояния одного и того же изображения, правда действительно обе картинки 24 bpp, RGB.
Если вам действительно интересна эта задача - можно попытаться объединить 1_.jpg c 0909_.jpg, обе картинки цветные, и уж точно сжаты с одними параметрами.
P.S. Собственно говоря это моя личная инициатива по автоматизации склейки старых изображений, задача изначально поставлена - сделать с "нуля" заново. :(
pzh2393, посмотрел, почитал… Полагаю, с Вашими изображениями — фокус не удастся.
Но почему Вам категорически не нравится простое склеивание:
"C:\Program Files\ImageMagick-6.8.0-Q16\convert.exe" 1_.jpg 0909_.jpg +append Result.jpg?
http://i.imgur.com/xY6R5Hr.jpg
Да, это один из возможных вариантов, я даже пробовал ключ позволяющий указать "качество" выходного JPEG.
Но для своих нужд, методом проб, так и не подобрал оптимальный вариант.
Либо выходной файл получается намного большим (примерно в 1,5, иногда в 2 раза) по "весу" (в килобайтах) чем суммарно два его "прародителя", либо уровень искажений при повторном сжатии практически уничтожает все мелкие элементы изображения, что так же нельзя принять как приемлемый результат.
P.S. Кстати, lossless склеивание с этими изображениями все равно не получился бы, поскольку выяснилось что для такой операции необходимо чтобы сторона была кратна 16.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.