Показать полную графическую версию : [решено] Обрезка картинки
Можно ли с помощью bat или сторонних программ обрезать края картинок jpg, расположенных "c:\WINDOWS\Web\Wallpaper\" до пропорций установленного разрешения экрана?
Можно. Либо с помощью сторонних программ, либо WSH, либо PoSH.
А зачем?
А зачем? »
Хочу добавить на установочный диск с задержкой исполнения на пару часов, чтобы после установки винды картинки фона рабочего стола были пропорциональными у пользователей с разными размерами мониторов.
п.с. желательно сделать без помощи сторонних программ.
sov44, надо понятней изъясняться.
Я понял, что основная проблема в том, что у разных пользователей мониторы с разными форм-факторами. Соответственно, скорее всего, будут и разные пропорции, у одних — 4x3, у других 16:9 и т.п.
И Вы хотите существующие изображения привести к пропорциям установленного у пользователей форм-фактора разрешения, иначе при установке «Расположение: Растянуть» у одних пользователей будет нормально, у других — изображение будет растянуто или ужато. И Вы хотите от этого избавиться. Так?
sov44, на основе этого (http://forum.script-coding.com/viewtopic.php?pid=30088#p30088) кода сделал такое:
Option Explicit
Dim objFSO
Dim objFile
Dim strPath2Wallpapers
Dim strPath2File
Dim objImageFile
Dim objImageProcess
Dim lngScreenHeight
Dim lngScreenWidth
Dim lngDelta
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objImageFile = WScript.CreateObject("WIA.ImageFile")
Set objImageProcess = WScript.CreateObject("WIA.ImageProcess")
strPath2Wallpapers = objFSO.BuildPath(objFSO.GetSpecialFolder(0).Path, "Web\Wallpaper")
With WScript.CreateObject("htmlfile")
With .Script.screen
lngScreenHeight = .Height
lngScreenWidth = .Width
End With
End With
If objFSO.FolderExists(strPath2Wallpapers) Then
For Each objFile In objFSO.GetFolder(strPath2Wallpapers).Files
WScript.Echo objFile.Path
objImageFile.LoadFile objFile.Path
With objImageProcess
.Filters.Add .FilterInfos("Crop").FilterID
With .Filters(1).Properties
If lngScreenHeight / lngScreenWidth > objImageFile.Height / objImageFile.Width Then
' Подрежем справа-слева
lngDelta = (objImageFile.Width - objImageFile.Height * lngScreenWidth / lngScreenHeight) / 2
.Item("Left") = lngDelta
.Item("Right") = lngDelta
ElseIf lngScreenHeight / lngScreenWidth < objImageFile.Height / objImageFile.Width Then
' Подрежем сверху-снизу
lngDelta = (objImageFile.Height - objImageFile.Width * lngScreenHeight / lngScreenWidth) / 2
.Item("Top") = lngDelta
.Item("Bottom") = lngDelta
Else
' Nothing to do
End If
End With
Set objImageFile = .Apply(objImageFile)
.Filters.Remove 1
End With
' Перезаписывать существующий файл компонент не умеет,
' потому предварительно удаляем файл…
strPath2File = objFile.Path
objFile.Delete
' Сохраняем файл под тем же именем:
objImageFile.SaveFile strPath2File
Next
Else
WScript.Echo "Wallpaper's folder [" & strPath2Wallpapers & "] not found"
End If
Set objImageProcess = Nothing
Set objImageFile = Nothing
Set objFSO = Nothing
WScript.Quit 0
Пробуйте.
Код для простоты сделан со следующими ограничениями:
* полагаем, что в папке «%SystemRoot%\Web\Wallpaper» нет иных файлов, кроме как изображений форматов, поддерживаемых библиотекой WIA;
* оригинальные файлы не сохраняются;
* изображения не масштабируются, только равномерно обрезаются до пропорций текущего разрешения экрана (и без учёта места, занимаемого панелью задач) с противоположных сторон.
Iska, а с каким расширением сохранять скрипт и в какой кодировке? :dont-know
Расширение — «.vbs», кодировка — «Windows-1251», запуск:
cscript.exe //nologo "<путь к файлу скрипта>"
Iska, не получилась обработка картинок.
Для пробы изменил путь к картинкам на strPath2Wallpapers = objFSO.BuildPath(objFSO.GetSpecialFolder(0).Path, "Web\Wallpaper1") и запустил скрипт через командное окно тотала cscript.exe //nologo "c:\перевалка\обрезка картинок.vbs"
п.с. можно ли сделать, чтобы скрипт запускался сразу, не прописывая каждый раз путь к нему?
Iska, не получилась обработка картинок. »
А что получилось?
п.с. можно ли сделать, чтобы скрипт запускался сразу, не прописывая каждый раз путь к нему? »
Поясните Ваш вопрос.
А что получилось? »
нечего не получилось. Размеры картинок в папке Wallpaper1 не изменились.
1. И никаких сообщений, например, о найденных изображениях или об ошибках? Надеюсь, Вы запускали скрипт из командной строки?
2. А размеры точно должны были измениться?
3. Если — да, то приведите пример такого изображения и укажите форм-фактор, к которому должно было быть приведено изображение (изображение выкладывайте в архиве, а не картинкой!).
sov44, письмо получил, архив загрузил, файлы изображений опробовал. У меня всё отработало корректно, пропорции Ваших изображений поменялись в соответствии с форм-фактором текущего разрешения.
Попробуйте исполнить скрипт именно в командной строке, как я писал выше (http://forum.oszone.net/post-1910955.html#post1910955), а не из-под Total Commander'а.
Iska, пробовал запускать скрипт как с помощью батника, так и на прямую из командной строки как на рабочей системе, так и на виртуальной свежеустановленной оригинальной Windows XP. Увы, во всех случаях одна и та-же ошибка.
http://savepic.su/1940974m.jpg (http://savepic.su/1940974.htm)
sov44, так это ж совсем другое дело ;). Это очень хорошо, что ошибка есть! Ибо сразу ясно, в чём тут дело.
Установите библиотеку Download: Windows® Image Acquisition Automation Library v2.0 Tool: Image acquisition and manipulation component for VB and scripting - Microsoft Download Center - Download Details (http://www.microsoft.com/en-us/download/details.aspx?id=18287).
Foreigner
10-05-2012, 06:45
Nconvert (http://www.xnview.com/en/nconvert.html) уже советовали? Для батников самое оно.
Foreigner, думаю, будет не очень удобно вычислять конечные размеры, прежде всего из-за наличия только целочисленной арифметики.
kiripanda
10-05-2012, 08:43
Iska
не вижу проблемы, кол-во пикселей же целое число
kiripanda, а отношение ширины к высоте и наоборот?
kiripanda
10-05-2012, 09:56
Del
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.