生成低位深度的图像文件?

时间:2009-01-27 11:12:04

标签: c# vb.net bitmap imaging

bpp =每像素位数,因此对于R / G / B / A,32bpp表示8/8/8/8。

像.NET有这些“System.Drawing.Imaging.PixelFormat”的枚举。

现在,一旦我的图形有位图图像对象,我将如何将其保存到文件/我将采用何种格式使用?

什么图像文件格式(JPEG / GIF / PNG)支持低位深度,如16bpp或8bpp (而不是通常的32bpp或24bpp)

5 个答案:

答案 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 || {
    ...
});

Make1bpp

这是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,但是图像质量成本。