将图像以其各自的格式保存到流中

时间:2011-11-22 01:04:46

标签: c# image-processing system.drawing

我遇到了一个涉及多个部分的挑战,其中大部分都没有问题。我需要一个读取图像流的功能,自动将其调整为指定大小,将图像压缩到特定的水平(如果适用)然后返回图像流,同时保持原始图像格式并保持透明度(如果有的话)任何。)

这涉及一个简单的调整大小功能,这对我来说没有问题。

它涉及阅读原始图像格式,此代码似乎有效:

// Detect image format
if (newImage.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Jpeg))
{
      //etc for other formats
}
//etc

返回图像流是我被卡住的地方。我可以使用压缩返回流,但默认为Jpeg。我没有看到指定格式的位置。当我通过保存图像两次指定格式时,我失去了透明度。

我想有两个问题:

1)如果我调整图像大小,是否还需要重建PNG上的Alpha透明度? 2)如何在保证透明度的同时以相应的格式保存到存储流中?

这是我破碎的代码!

System.Drawing.Imaging.ImageCodecInfo[] Info = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders();
System.Drawing.Imaging.EncoderParameters Params = new System.Drawing.Imaging.EncoderParameters(1);
long ImgComp = 80;
Params.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, ImgComp);

MemoryStream m_s = new MemoryStream();
// Detect image format
if (newImage.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Jpeg))
{
    newBMP.Save(m_s, ImageFormat.Jpeg);
}
else if (newImage.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Png))
{
    newBMP.Save(m_s, ImageFormat.Png);
}

// Save the new graphic file to the server

newBMP.Save(m_s, Info[1], Params);
retArr = m_s.ToArray();

1 个答案:

答案 0 :(得分:2)

这是我使用的,虽然我没有透明度测试。这样可以使图像保持原始格式,而无需切换原始格式。您可能默认为jpeg的原因是newImage.RawFormat作为格式的guid返回,而不是实际的枚举值:

    using (Bitmap newBmp = new Bitmap(size.Width, size.Height))
    {
        using (Graphics canvas = Graphics.FromImage(newBmp))
        {
            canvas.SmoothingMode = SmoothingMode.HighQuality;
            canvas.InterpolationMode = InterpolationMode.HighQualityBicubic;
            canvas.PixelOffsetMode = PixelOffsetMode.HighQuality;
            canvas.DrawImage(newImage, new Rectangle(new Point(0, 0), size));
            using (var stream = new FileStream(newLocation, FileMode.Create))
            {
                // keep image in existing format
                var newFormat = newImage.RawFormat;
                var encoder = GetEncoder(newFormat);
                var parameters = new EncoderParameters(1);
                parameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L);

                newBmp.Save(stream, encoder, parameters);
                stream.Flush();
            }
        }
    }

修改

我刚刚在png上对透明度进行了测试,并确实保留了它。我会把这个文件记录下来(直到现在,我只把它用于jpegs。)