首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将图像编辑到位

将图像编辑到位
EN

Stack Overflow用户
提问于 2022-09-26 22:54:01
回答 1查看 44关注 0票数 2

因此,我有一个小脚本,它打开一个图像:

代码语言:javascript
复制
    $file = ([System.IO.FileInfo]$FilePath);
    if ($file.Exists) {
        $imgInMemory = [System.Drawing.Image]::FromFile($file.FullName);
        [...irrelevant code to the question...]
        $imgInMemory.Save($($file.FullName + '.tmp'), $codecInfo, $encoderParams);
        Move-Item -Path $($file.FullName + '.tmp') -Destination $file.FullName -Force;
    }

因此,我使用Image.FromFile方法加载文件内容,并试图将其保存回相同的文件名。我试过:

  1. $imgInMemory.Dispose()和$graphics.Dispose()后面跟着.tmp保存调用和上面看到的移动项调用。这仍然会导致访问被拒绝的异常。

在打开的文件句柄方面,我遗漏了什么,因为看起来即使是移动项上的-Force也只删除.tmp文件而不覆盖原始文件。所以,如果您正在做一些事情,比如向图像中添加引脚,是否可以将输出保存回原始文件?如果是,怎么做?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-27 00:07:15

您可以在不需要创建临时文件的情况下完成此过程,不清楚为什么您的代码会失败,尽管这应该有效:

在将新内容保存到输入文件之前,在输入文件的输入ReadWrite FileAccess.

  • Use file..

代码语言:javascript
复制
using namespace System.IO
using namespace System.Drawing
using namespace System.Drawing.Imaging

Add-Type -AssemblyName System.Drawing

$inFile   = [FileInfo] 'path\to\file1.ext'
$refFile  = 'path\to\file2.ext'

if ($file.Exists) {
    $inStream  = $inFile.Open([FileMode]::Open, [FileAccess]::ReadWrite)

    $inImg  = [Image]::FromStream($inStream)
    $refImg = [Image]::FromFile($refFile)

    # irrelevant code here...

    $inStream.SetLength(0)
    $inImg.Save($inStream, $imageCodecInfo, $encoderParams)
    $refImg, $inImg, $inStream | ForEach-Object Dispose
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73860711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档