Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Обрезка картинки (http://forum.oszone.net/showthread.php?t=234042)

sov44 04-05-2012 15:50 1910504

Обрезка картинки
 
Можно ли с помощью bat или сторонних программ обрезать края картинок jpg, расположенных "c:\WINDOWS\Web\Wallpaper\" до пропорций установленного разрешения экрана?

Iska 04-05-2012 16:02 1910512

Можно. Либо с помощью сторонних программ, либо WSH, либо PoSH.

А зачем?

sov44 04-05-2012 16:09 1910517

Цитата:

Цитата Iska
А зачем? »

Хочу добавить на установочный диск с задержкой исполнения на пару часов, чтобы после установки винды картинки фона рабочего стола были пропорциональными у пользователей с разными размерами мониторов.
п.с. желательно сделать без помощи сторонних программ.

Iska 04-05-2012 17:51 1910578

sov44, надо понятней изъясняться.

Я понял, что основная проблема в том, что у разных пользователей мониторы с разными форм-факторами. Соответственно, скорее всего, будут и разные пропорции, у одних — 4x3, у других 16:9 и т.п.

И Вы хотите существующие изображения привести к пропорциям установленного у пользователей форм-фактора разрешения, иначе при установке «Расположение: Растянуть» у одних пользователей будет нормально, у других — изображение будет растянуто или ужато. И Вы хотите от этого избавиться. Так?

sov44 04-05-2012 18:07 1910592

Цитата:

Цитата Iska
Так? »

Так.

Iska 04-05-2012 23:10 1910742

sov44, на основе этого кода сделал такое:
читать дальше »
Код:

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;
* оригинальные файлы не сохраняются;
* изображения не масштабируются, только равномерно обрезаются до пропорций текущего разрешения экрана (и без учёта места, занимаемого панелью задач) с противоположных сторон.

sov44 04-05-2012 23:50 1910765

Iska, а с каким расширением сохранять скрипт и в какой кодировке? :dont-know

Iska 05-05-2012 00:21 1910777

Расширение — «.vbs», кодировка — «Windows-1251», запуск:
Код:

cscript.exe //nologo "<путь к файлу скрипта>"

sov44 05-05-2012 00:49 1910787

Iska, не получилась обработка картинок.
Для пробы изменил путь к картинкам на
Код:

strPath2Wallpapers = objFSO.BuildPath(objFSO.GetSpecialFolder(0).Path, "Web\Wallpaper1")
и запустил скрипт через командное окно тотала
Код:

cscript.exe //nologo "c:\перевалка\обрезка картинок.vbs"
п.с. можно ли сделать, чтобы скрипт запускался сразу, не прописывая каждый раз путь к нему?

Iska 05-05-2012 04:55 1910809

Цитата:

Цитата sov44
Iska, не получилась обработка картинок. »

А что получилось?

Цитата:

Цитата sov44
п.с. можно ли сделать, чтобы скрипт запускался сразу, не прописывая каждый раз путь к нему? »

Поясните Ваш вопрос.

sov44 05-05-2012 10:14 1910887

Цитата:

Цитата Iska
А что получилось? »

нечего не получилось. Размеры картинок в папке Wallpaper1 не изменились.

Iska 05-05-2012 13:25 1910955

1. И никаких сообщений, например, о найденных изображениях или об ошибках? Надеюсь, Вы запускали скрипт из командной строки?
2. А размеры точно должны были измениться?
3. Если — да, то приведите пример такого изображения и укажите форм-фактор, к которому должно было быть приведено изображение (изображение выкладывайте в архиве, а не картинкой!).

Iska 05-05-2012 18:55 1911120

sov44, письмо получил, архив загрузил, файлы изображений опробовал. У меня всё отработало корректно, пропорции Ваших изображений поменялись в соответствии с форм-фактором текущего разрешения.

Попробуйте исполнить скрипт именно в командной строке, как я писал выше, а не из-под Total Commander'а.

sov44 10-05-2012 00:13 1913199

Iska, пробовал запускать скрипт как с помощью батника, так и на прямую из командной строки как на рабочей системе, так и на виртуальной свежеустановленной оригинальной Windows XP. Увы, во всех случаях одна и та-же ошибка.

Iska 10-05-2012 05:33 1913232

sov44, так это ж совсем другое дело ;). Это очень хорошо, что ошибка есть! Ибо сразу ясно, в чём тут дело.

Установите библиотеку Download: Windows® Image Acquisition Automation Library v2.0 Tool: Image acquisition and manipulation component for VB and scripting - Microsoft Download Center - Download Details.

Foreigner 10-05-2012 06:45 1913237

Nconvert уже советовали? Для батников самое оно.

Iska 10-05-2012 07:53 1913247

Foreigner, думаю, будет не очень удобно вычислять конечные размеры, прежде всего из-за наличия только целочисленной арифметики.

kiripanda 10-05-2012 08:43 1913269


Iska
не вижу проблемы, кол-во пикселей же целое число

Iska 10-05-2012 09:14 1913278

kiripanda, а отношение ширины к высоте и наоборот?

kiripanda 10-05-2012 09:56 1913290

Del

sov44 10-05-2012 11:06 1913327

kiripanda, условием задачи было определение установленного разрешения экрана и образка краёв картинки до пропорций этого разрешения. Настройка свойств экрана - фоновый рисунок растянут.

kiripanda 10-05-2012 12:38 1913358

Del

Iska 10-05-2012 13:09 1913378

kiripanda, не то.

1. В приведённом Вами коде изображение обрезается, невзирая на его собственные размеры, до размеров экрана. А надо — а) согласно его собственным размерам и б) пропорционально размерам экрана.

2. Изображение может быть меньше размеров экрана.

Iska 10-05-2012 16:55 1913525

kiripanda, зачем «Del»? Статься, кому-нибудь именно Ваш вариант бы и пригодился.

kiripanda 10-05-2012 17:19 1913536

Код:

@echo off &setlocal enabledelayedexpansion

set in=z:\sklad\
set out=c:\windows\Web\Wallpaper\
set i_view=i_view32.exe

for /f %%s in ('wmic DesktopMonitor get ScreenHeight^,ScreenWidth /value ^|find "="') do set "%%s"
for /f "delims=" %%f in ('dir /b/a-d/s %in%\*.jpg') do (
        title "%%f"
        %i_view% "%%f" /info=%temp%\info.tmp
        for /f "tokens=4,6" %%x in ('type %temp%\info.tmp ^|find "Image dimensions"') do (
                set /a newx=%%x*%ScreenHeight%/%%y &set /a newy=%%y*%ScreenWidth%/%%x
                if "!newy!" GEQ "%ScreenHeight%" %i_view% "%%f" /resize_long=%ScreenWidth% /aspectratio /resample /convert=temp.bmp
                if "!newx!" GEQ "%ScreenWidth%" %i_view% "%%f" /resize_short=%ScreenHeight% /aspectratio /resample /convert=temp.bmp
                %i_view% %in%\temp.bmp /info=%temp%\info.tmp
                for /f "tokens=4,6" %%x in ('type %temp%\info.tmp ^|find "Image dimensions"') do (
                        if "%%y" GTR "%ScreenHeight%" (
                                set /a starty=^(%%y-%ScreenHeight%^)/2
                                %i_view% %in%\temp.bmp /crop=^(0,!starty!,%ScreenWidth%,%ScreenHeight%^) /jpgq=90 /convert=%out%\%%~nf.jpg
                        )
                        if "%%x" GEQ "%ScreenWidth%" (
                                set /a startx=^(%%x-%ScreenWidth%^)/2
                                %i_view% %in%\temp.bmp /crop=^(!startx!,0,%ScreenWidth%,%ScreenHeight%^) /jpgq=90 /convert=%out%\%%~nf.jpg
                        )
                )
        )
)
del /q %temp%\info.tmp %in%\temp.bmp


sov44 10-05-2012 20:30 1913626

kiripanda, попробовал скрипт, ошибка :(
читать дальше »

в скрипте изменил только путь к папке sklad

kiripanda 10-05-2012 20:48 1913632

попробуй указать полный путь к i_view32.exe

sov44 10-05-2012 21:22 1913656

Цитата:

Цитата kiripanda
попробуй указать полный путь к i_view32.exe »

аналогичная ошибка.
читать дальше »

Пробовал указать полный путь как к директории установки i_view, так и отдельно к папке с батником и копией i_view32.exe

kiripanda 10-05-2012 22:10 1913694

in и out если уж брать в кавычки, то
set "in=z:\sklad\"
set "out=c:\windows\Web\Wallpaper\"

Iska 10-05-2012 22:48 1913711

kiripanda, новый код так же масштабирует изображения к разрешению экрана вместо простого обрезания краёв сверху или снизу. Также изображения, у которых высота больше ширины, становятся банально квадратными со стороной, равной высоте экрана — т.е. недостаточно урезаются по высоте.

sov44, так мой код заработал у Вас после установки библиотеки?

sov44 10-05-2012 22:56 1913716

Цитата:

Цитата Iska
sov44, так мой код заработал у Вас после установки библиотеки? »

да, спасибо, всё работает. Отметил тему решённой. Интересен альтернативный метод в cmd.

El Sanchez 11-05-2012 12:05 1913926

Цитата:

Цитата sov44
kiripanda, попробовал скрипт, ошибка »

sov44, у вас wmic ничего не возвращает. Попробуйте заменить
Код:

wmic DesktopMonitor get ScreenHeight^,ScreenWidth /value
на
Код:

wmic path Win32_VideoController get CurrentVerticalResolution^,CurrentHorizontalResolution /value
Найти все %ScreenHeight% и %ScreenWidth% и заменить на %CurrentVerticalResolution% и %CurrentHorizontalResolution% соответственно.

sov44 14-05-2012 14:53 1915704

Iska, Можно ли поправить Ваш скрипт vbs в посте 6, чтобы рядом создавался бэкап папки Wallpaper, а затем обработка картинок?

Iska 15-05-2012 23:13 1916644

sov44, пробуйте:
читать дальше »
Код:

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
        With objFSO.GetFolder(strPath2Wallpapers)
                ' Создадим копию папки %SystemRoot%\Web\Wallpaper
                .Copy objFSO.BuildPath(objFSO.GetSpecialFolder(0).Path, "Web\Wallpaper.bak"), True
       
                For Each objFile In .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
        End With
Else
        WScript.Echo "Wallpaper's folder [" & strPath2Wallpapers & "] not found"
End If

Set objImageProcess = Nothing
Set objImageFile    = Nothing
Set objFSO          = Nothing

WScript.Quit 0


Копия папки получит имя «Wallpaper.bak».


Время: 05:44.

Время: 05:44.
© OSzone.net 2001-