Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » [решено] Задача по автоматизации. Склейка 2х jpg файлов

Ответить
Настройки темы
[решено] Задача по автоматизации. Склейка 2х jpg файлов

Новый участник


Сообщения: 29
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


Добрый день.

Есть более тысячи файлов изображений. Размер маленький, каждый 400-600кб. Файлы одинаковые - ширина, высота, ориентация (книжная) и битность (серый 8bit). Имена файлов последовательно (2011_0001, 2011_0002 ... и т.д.). Склейка - по узкой стороне.

Требуется "взять" первый (нечетный) и снизу приклеить второй (четный) и сохранить в файл 2011_s***. Вместо звездочек нарастающий номер. Идеальный вариант: указать 2 папки - откуда брать и куда складывать. Работа разовая - ПО не критично, поставим, сделаем и снесем.

Какие уважаемое общество может предложить варианты.

Отправлено: 19:11, 22-08-2011

 

Аватара для ferget

Разный


Сообщения: 1294
Благодарности: 359

Профиль | Отправить PM | Цитировать


с ImageMagick идет утилита convert.exe, она может объединять файлы

а bat-файл помогут написать здесь http://forum.oszone.net/forum-102.html
Это сообщение посчитали полезным следующие участники:

Отправлено: 20:47, 22-08-2011 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


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
Это сообщение посчитали полезным следующие участники:

Отправлено: 02:01, 23-08-2011 | #3


Аватара для ferget

Разный


Сообщения: 1294
Благодарности: 359

Профиль | Отправить PM | Цитировать


а зачем столько echo?

Последний раз редактировалось ferget, 23-08-2011 в 05:37.


Отправлено: 05:27, 23-08-2011 | #4


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Я исполняю скрипты под консольным «cscript.exe» (я указал на это обстоятельство в примере; более того — «cscript.exe» у меня назначен как стандартный сервер сценариев [вместо «wscript.exe»]). Это даёт такое преимущество, как возможность вывода текста, индикаторы прогресса в консоли, простое перенаправление вывода в файл и т.п.

Ну, и работаю я под Far Manager'ом, где вывод консольной программы сразу можно перенаправить в его вьюер, або в редактор.
Это сообщение посчитали полезным следующие участники:

Отправлено: 06:03, 23-08-2011 | #5


Новый участник


Сообщения: 29
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


Цитата Iska:
irvicon, попробуйте так: »
Сегодня попробую.

Отправлено: 07:41, 23-08-2011 | #6


Новый участник


Сообщения: 29
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


Цитата Iska:
irvicon, попробуйте так »
Работает! Большое спасибо.
Куда слать пиво?)

Отправлено: 09:54, 23-08-2011 | #7


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата irvicon:
Куда слать пиво?) »
Спросите у Администрации. Может им нужно .

Отправлено: 12:22, 23-08-2011 | #8


Новый участник


Сообщения: 9
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Iska:
irvicon, попробуйте так:
читать дальше » »
Прекрасное решение, мощь не уступающая линукс консоли, но менее понятная большинству.
Большое спасибо за предложенный вариант, немного допилив использовал и в своих целях.

Отправлено: 17:46, 15-02-2014 | #9


Пользователь


Сообщения: 93
Благодарности: 2

Профиль | Отправить PM | Цитировать


А с чем может быть связана ошибка "Could not locate automation class named "WIA.ImageFile"" при запуске указанного выше VBS скрипта?

И каким образом там вообще осуществляется склейка изображений, с пережатием или без?

Собственно был бы очень благодарен если подскажите решение по объединению двух JPEG файлов (одинаковая ширина и высота, а так же параметры сжатия) в один, желательно lossless.

А так же прошу подсказать, что необходимо поправить в скрипте, если правому файлу "***.jpg" соответсвует левый "***_.jpg" (имя файла произвольной длинны).

Отправлено: 14:48, 27-01-2015 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » [решено] Задача по автоматизации. Склейка 2х jpg файлов

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Графика - Пакетная проверка кучи jpg/jpeg файлов на предмет повреждений Jr.Janitor Программное обеспечение Windows 18 06-02-2014 22:01
CMD/BAT - Перемещение файлов (jpg) по их количеству dark-------13 Скриптовые языки администрирования Windows 3 27-04-2011 16:20
Разное - Задержка после закрытия файлов txt, jpg nikon161 Microsoft Windows 2000/XP 4 06-01-2010 23:58
[решено] Склейка частей изображения dzekka Хочу все знать 2 13-03-2004 12:54




 
Переход