gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:15:05 24 4
gpt4 key购买 nike

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

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

它涉及读取原始图像格式,这段代码似乎可以工作:

// 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();

最佳答案

这就是我使用的,虽然我还没有测试透明度。这使图像保持其原始格式,而无需打开原始格式。您可能默认使用 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 上用透明度测试了它,它确实保留了它。我会在提示下归档(到目前为止,我只将它用于 jpeg。)

关于c# - 将图像以其各自的格式保存到流中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8220724/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com