保存前降低图像/流的质量

  • 本文关键字:图像 保存 c# stream
  • 更新时间 :
  • 英文 :


我正在尝试获取一个输入流(图像的zip文件)并提取每个文件。但是我必须在保存每个图像之前降低它们的质量(如果质量<100)。我尝试过以下操作,但它从不压缩图像:

public void UnZip(Stream inputStream, string destinationPath, int quality = 80) {
    using (var zipStream = new ZipInputStream(inputStream)) {
        ZipEntry entry;
        while ((entry = zipStream.GetNextEntry()) != null) {
            var directoryPath = Path.GetDirectoryName(destinationPath + Path.DirectorySeparatorChar + entry.Name);
            var fullPath = directoryPath + Path.DirectorySeparatorChar + Path.GetFileName(entry.Name);
            // Create the stream to unzip the file to
            using (var stream = new MemoryStream()) {
                // Write the zip stream to the stream
                if (entry.Size != 0) {
                    var size = 2048;
                    var data = new byte[2048];
                    while (true) {
                        size = zipStream.Read(data, 0, data.Length);
                        if (size > 0)
                            stream.Write(data, 0, size);
                        else
                            break;
                    }
                }
                // Compress the image and save it to the stream
                if (quality < 100)
                    using (var image = Image.FromStream(stream)) {
                        var info = ImageCodecInfo.GetImageEncoders();
                        var @params = new EncoderParameters(1);
                        @params.Param[0] = new EncoderParameter(Encoder.Quality, quality);
                        image.Save(stream, info[1], @params);
                    }
                }
                // Save the stream to disk
                using (var fs = new FileStream(fullPath, FileMode.Create)) {
                    stream.WriteTo(fs);
                }
            }
        }
    }
}

如果有人能告诉我我做错了什么,我将不胜感激。此外,任何关于整理它的建议都将受到赞赏,因为代码变得有点难看。感谢

您真的不应该使用同一个流来保存压缩图像。MSDN文档明确指出:"不要将图像保存到用于构建图像的同一个流中。这样做可能会损坏流。"(MSDN关于image.save(…)的文章)

using (var compressedImageStream = new MemoryStream())
{
    image.Save(compressedImageStream, info[1], @params);
}

另外,您将编码成什么文件格式?您尚未指定。你刚刚找到第二个编码器。你不应该依赖结果的顺序。搜索特定的编解码器:

var encoder = ImageCodecInfo.GetImageEncoders().Where(x => x.FormatID == ImageFormat.Jpeg.Guid).SingleOrDefault()

别忘了检查你的系统上是否不存在编码器:

if (encoder != null)
{ .. }

"质量"参数并不适用于所有文件格式。我想你可能在使用JPEGs?此外,请记住,100%JPEG质量!=无损图像。您仍然可以使用质量=100进行编码并减少空间。

从zip流中提取图像后,没有压缩图像的代码。您所要做的似乎只是将解压缩的数据放入MemoryStream,然后根据质量信息将图像写入同一个流(根据编解码器的不同,可能会压缩图像,也可能不会压缩图像)。我首先建议不要按照你正在阅读的同一条流写作。此外,你从编码器中得到的"压缩"是什么。质量属性取决于图像的类型——你还没有提供任何详细信息。如果图像类型支持压缩,并且输入的图像质量低于100,你就不会得到任何大小的缩小。此外,你还没有提供任何相关信息。长话短说,你没有提供足够的信息让任何人给你一个真正的答案。

相关内容

  • 没有找到相关文章

最新更新