bpp =每像素位数,因此对于R / G / B / A,32bpp表示8/8/8/8。
像.NET有这些“System.Drawing.Imaging.PixelFormat”的枚举。
现在,一旦我的图形有位图或图像对象,我将如何将其保存到文件/我将采用何种格式使用?
什么图像文件格式(JPEG / GIF / PNG)支持低位深度,如16bpp或8bpp (而不是通常的32bpp或24bpp)
答案 0 :(得分:13)
我不认为对方的回答测试了他们的代码,因为GDI + PNG不支持Encoder.BitDepth EncoderParameter。事实上,唯一的Codec就是TIFF。
您需要在保存之前更改图像的PixelFormat,以便对输出产生任何影响。这并不总能产生您期望的PixelFormat。有关哪些PixelFormats变成什么内容的详细信息,请参阅my post here。
对于PixelFormat转换,以下内容将起作用:
private Bitmap ChangePixelFormat(Bitmap inputImage, PixelFormat newFormat)
{
Bitmap bmp = new Bitmap(inputImage.Width, inputImage.Height, newFormat);
using (Graphics g = Graphics.FromImage(bmp))
{
g.DrawImage(inputImage, 0, 0);
}
return bmp;
}
不幸的是,这些转换可能会产生一些非常糟糕的输出。在执行有损转换(高位深度到较低位)的情况下尤其如此。
答案 1 :(得分:1)
试试这个:
ImageCodecInfo pngCodec = ImageCodecInfo.GetImageEncoders().Where(codec => codec.FormatID.Equals(ImageFormat.Png.Guid)).FirstOrDefault();
if (pngCodec != null)
{
EncoderParameters parameters = new EncoderParameters();
parameters.Param[0] = new EncoderParameter(Encoder.ColorDepth, 8);
myImage.Save(myStream, pngCodec, parameters);
}
答案 2 :(得分:1)
这仅从.Net产生尽可能小的PNG。请注意,它是b& w - 甚至不是灰度级。对文档有用。
消费者代码:
let mut csv = csv_s();
thread::spawn(move || {
...
});
这是PNG编码器关心的问题
Dim src = (the original bitmap)
Using img = New Bitmap(src.Width, src.Height, PixelFormat.Format16bppRgb555) ' Provided Make1bpp function requires this
img.SetResolution(src.HorizontalResolution, src.VerticalResolution)
Using g = Graphics.FromImage(img)
g.Clear(Color.White) ' remove transparancy
g.DrawImage(src, 0, 0, src.Width, src.Height)
End Using
Using img2 As Bitmap = Make1bpp(img)
img2.SetResolution(src.HorizontalResolution, src.VerticalResolution)
Dim myencoder = (From parm In ImageCodecInfo.GetImageEncoders() Where parm.MimeType = "image/png").First()
Dim encoderParams = New EncoderParameters(1)
encoderParams.Param(0) = New EncoderParameter(Encoder.ColorDepth, 8L)
If IO.File.Exists(pngName) Then
IO.File.Delete(pngName)
End If
img2.Save(pngName, myencoder, encoderParams)
End Using
End Using
答案 3 :(得分:0)
所有图像格式都有效地支持低位深度。如果不需要,您只需将最后一位保留为未使用状态。 GIF仅支持低色;你被限制在256种颜色。
答案 4 :(得分:-1)
未经测试的代码 -
Image myImage = new Image();
EncoderParameters parameters = new EncoderParameters(1);
parameters.Param[0] = new EncoderParameter(Encoder.ColorDepth, 8);
myImage.Save(somestream, ImageFormat.Png, parameters);
查看System.Drawing.Imaging命名空间,并使用Encoder.xxx参数设置和image.Save方法进行播放。 HTH。
<强>更新强> 另外值得注意的是,如果你想要一个小图像(低字节数),你可以尝试使用Encoder.Compression压缩保存为JPEG,但是图像质量成本。