将RGB图像转换为RGB 16位和8位

时间:2015-10-07 11:36:04

标签: c# winforms rgb

我是新手程序员。 有没有算法将图像转换为16位或8位? 我没有在谷歌上找到它,我绝望了。

3 个答案:

答案 0 :(得分:1)

更容易更改为16位。假设原始图像在image中,您只需将其绘制到结果中即可。

Bitmap result = new Bitmap(image.Width, image.Height, PixelFormat.Format16bppRgb565);
using (Graphics g = Graphics.FromImage(result))
{
    g.DrawImage(image, 0, 0, image.Width, image.Height);
}

不幸的是,这不适用于索引图像(带调色板的图像,最多256种颜色)。但您可以在我的回答here中找到解决方案,请参阅ConvertPixelFormat方法。

答案 1 :(得分:0)

16位rgb和8位rgb之间的唯一区别是范围,16位的值从0到65536,而8位的值从0到256,因此您应该能够通过以下方式设置16位rgb值: 256使用整数除法(为简单起见)并将转换。 (您需要将每个平面中的值确定为256)

答案 2 :(得分:0)

将RGB图像转换为8位

public static Bitmap ConvertFromRGBTo8bit(this Bitmap rgbBmp)
{
    // Copy image to byte Array
    var BoundsRectSrc = new Rectangle(0, 0, rgbBmp.Width, rgbBmp.Height);
    BitmapData bmpDataSrc = rgbBmp.LockBits(BoundsRectSrc, ImageLockMode.WriteOnly, rgbBmp.PixelFormat);
    IntPtr ptrSrc = bmpDataSrc.Scan0;
    int imgSizeSrc = bmpDataSrc.Stride * rgbBmp.Height;
    byte[] rgbValues = new byte[imgSizeSrc];
    Marshal.Copy(ptrSrc, rgbValues, 0, imgSizeSrc);

    // Crearte bitmap with 8 index grayscale
    Bitmap newBmp = new Bitmap(rgbBmp.Width, rgbBmp.Height, PixelFormat.Format8bppIndexed);
    ColorPalette ncp = newBmp.Palette;
    for (int i = 0; i < 256; i++)
        ncp.Entries[i] = Color.FromArgb(255, i, i, i);
    newBmp.Palette = ncp;

    var BoundsRectDst = new Rectangle(0, 0, rgbBmp.Width, rgbBmp.Height);
    BitmapData bmpDataDst = newBmp.LockBits(BoundsRectDst, ImageLockMode.WriteOnly, newBmp.PixelFormat);
    IntPtr ptrDst = bmpDataDst.Scan0;
    int imgSizeDst = bmpDataDst.Stride * newBmp.Height;
    byte[] grayValues = new byte[imgSizeDst];

    // Convert image to 8 bit according average pixel
    if (rgbBmp.PixelFormat == PixelFormat.Format16bppRgb555 || rgbBmp.PixelFormat == PixelFormat.Format16bppRgb565)
        for (int i = 0, j = 0; i < grayValues.Length; i++, j += 2)
            grayValues[i] = (byte)((rgbValues[j] + rgbValues[j + 1]) / 2);
    else if (rgbBmp.PixelFormat == PixelFormat.Format24bppRgb)
        for (int i = 0, j = 0; i < grayValues.Length; i++, j += 3)
            grayValues[i] = (byte)((rgbValues[j] + rgbValues[j + 1] + rgbValues[j + 2]) / 3);
    else if (rgbBmp.PixelFormat == PixelFormat.Format32bppRgb)
        for (int i = 0, j = 0; i < grayValues.Length; i++, j += 4)
            grayValues[i] = (byte)((rgbValues[j] + rgbValues[j + 1] + rgbValues[j + 2] + rgbValues[j + 3]) / 4);

    Marshal.Copy(grayValues, 0, ptrDst, imgSizeDst);
    newBmp.UnlockBits(bmpDataDst);
    rgbBmp.UnlockBits(bmpDataSrc);

    return newBmp;
}