【问题标题】:c# JpegBitmapEncoder save and overwitec# JpegBitmapEncoder 保存和覆盖
【发布时间】:2018-01-26 17:38:03
【问题描述】:

我正在尝试将标签添加到 jpeg 文件。

但是,我的算法阻止我覆盖 jpeg 文件,并且只允许我创建一个新文件。

  static string file = @"C:\temp\check.jpg";
    static void Main(string[] args)
    {
        LosslessJpegTest(new List<string> { "hello","my name is Bob"});
    }

    private static void LosslessJpegTest(List<string> keywords)
    {
        string original = file;
        const BitmapCreateOptions createOptions = BitmapCreateOptions.PreservePixelFormat;


        Stream originalFileStream = File.Open(original, FileMode.Open, FileAccess.ReadWrite);

        BitmapDecoder decoder = BitmapDecoder.Create(originalFileStream, createOptions, BitmapCacheOption.None);            


        if (decoder.CodecInfo == null || (!decoder.CodecInfo.FileExtensions.Contains("jpg")&& !decoder.CodecInfo.FileExtensions.Contains("jpeg")) || decoder.Frames[0] == null)
            return;

        BitmapMetadata metadata = decoder.Frames[0].Metadata == null
            ? new BitmapMetadata("jpg")
            : decoder.Frames[0].Metadata.Clone() as BitmapMetadata;

        if (metadata == null) return;

        if (metadata.Keywords != null)
        keywords.AddRange(metadata.Keywords);                    

        metadata.Keywords = new ReadOnlyCollection<string>(keywords);

        JpegBitmapEncoder encoder = new JpegBitmapEncoder { QualityLevel = 100 };
        BitmapFrame bmpFrame = BitmapFrame.Create(decoder.Frames[0], decoder.Frames[0].Thumbnail, metadata, decoder.Frames[0].ColorContexts);

        encoder.Frames.Add(bmpFrame);

        Stream newFileStream = File.Open(original, FileMode.Create, FileAccess.ReadWrite);
        encoder.Save(newFileStream);

    }

抛出的 execption 是:System.IO.IOException: '进程无法访问文件'C:\temp\check.jpg',因为它正被另一个进程使用。'

如何用新标签覆盖文件? 我不想为此目的保存一个临时文件,然后用原始文件替换它。

【问题讨论】:

    标签: c# tags jpeg jpegbitmapencoder


    【解决方案1】:

    作为一个简短的猜测,我想说您可能需要在尝试写入该文件之前关闭您的输入流。

    【讨论】:

    • 如果我关闭 originalFileStream 会发生以下异常: System.IO.IOException: 'Cannot read from the stream.'
    • 是的,你不能同时读取和写入文件,也许你应该将位图读入内存流,然后关闭原始文件流并使用内存流写入。跨度>
    • 什么是内存流?我该怎么做?
    猜你喜欢
    • 1970-01-01
    • 2014-05-19
    • 2017-07-25
    • 2011-11-29
    • 1970-01-01
    • 2011-08-17
    • 2014-08-24
    • 2018-09-23
    相关资源
    最近更新 更多