Компьютерный форум 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=349078)

9119 25-06-2021 14:28 2960873

поправить скрипт перекодирования изображений
 
Добрый.
Использую такой скрипт:


Код:

Get-ChildItem -Path "E:\tmp\*" -include *.jpg, *jpg*.*, *.png, *png*.*, *.jpeg, *jpeg*.*, *.webp, *webp*.* -Recurse | foreach-object {

    $Source = $_.FullName
    $test = [System.IO.Path]::GetDirectoryName($source)
    $base= $_.BaseName+".jpg"
    $basedir = $test+"\"+$base
    Write-Host $basedir
    Add-Type -AssemblyName system.drawing
    $imageFormat = "System.Drawing.Imaging.ImageFormat" -as [type]
    $image = [drawing.image]::FromFile($Source)

    # Create a new image
    $NewImage = [System.Drawing.Bitmap]::new($Image.Width,$Image.Height)
    $NewImage.SetResolution($Image.HorizontalResolution,$Image.VerticalResolution)

    # Add graphics based on the new image
    $Graphics = [System.Drawing.Graphics]::FromImage($NewImage)
    $Graphics.Clear([System.Drawing.Color]::White) # Set the color to white
    $Graphics.DrawImageUnscaled($image,0,0) # Add the contents of $image

    # Now save the $NewImage instead of $image
        $Source.Dispose()
        $NewImage.Save($basedir,$imageFormat::Jpeg)
}

находим все по маске в подпапках и перекодируем в jpeg (нужно для лучшей совместимости при последующей обработке)


При выполнении получаю ошибку:
Код:

Исключение при вызове "Save" с "2" аргументами: "В GDI+ возникла ошибка общего вида."
ошибка из-за того, что не дает перезаписать файлы, т.к они заняты самим скриптом.
в тоже время по строке
Код:

$Source.Dispose()
выдает
Код:

Сбой вызова метода из-за отсутствия в [System.String] метода с именем "Dispose".


Нужно: чтобы файлы перезаписывались, это принципиально нужно. Может как-то через буфер реализовать. И были не заняты никаким процессом после перекодировки.

9119 25-06-2021 18:06 2960891

пока сделал так, чтобы сохраняло под другим именем (дописывало new_), а потом через remove-item -exclude *new_*.* удаляю все ненужное.
но все таки хотелось бы сразу чтобы перезаписывало, и освобождало доступ к файлу.

Iska 26-06-2021 09:26 2960942

Цитата:

Цитата 9119
в тоже время по строке
Код:

$Source.Dispose()
выдает
Код:

Сбой вызова метода из-за отсутствия в [System.String] метода с именем "Dispose".
»

Так зачем Вы вызываете .Dispose() для строки с полным именем файла?!

9119 26-06-2021 22:06 2960979

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

Но вопрос в том, что .Dispose() впринципе не вызывается. не для чего.

Где-то попадалась инфа как этот момент( с блокировкой входного файла на перезапись) обходили используя буфер.
т.е входнной файл помещали в буфер и от туда его использовали или как-то так, в результате чего перезаписать файл можно было без проблем и без .Dispose()


Время: 10:22.

Время: 10:22.
© OSzone.net 2001-