我是一名新手程序員。 是否有任何算法將圖像轉換爲16位或8位? 我沒有在谷歌上找到它,我很絕望。將RGB圖像轉換爲RGB 16位和8位
回答
16位rgb和8位rgb之間的唯一區別是範圍,16位的值爲0到65536,而8位的值爲0到256,因此您應該能夠分配16位rgb值由256使用整數除法(爲簡單起見),將被轉換。 (您需要決定每個平面中的值256)
這根本不是真的。對8位圖像進行索引,這意味着圖像中像素的值不是顏色,而是對256色表格的引用。實際上,16位圖像在16位像素值內包含完整的RGB顏色。 – Nyerguds
@Nyerguds用於Gif格式以節省空間。對於通用RGB(位圖樣式)圖像(任意顏色精度),通常將其存儲爲表示紅色通道,綠色通道和藍色通道的必需大小(8位,16位,23位......)的3個灰度位圖。 – Cjen1
你在說平面圖像嗎?你知道,具有8位值的三架飛機仍然是24位圖像。它保存的方式不會改變這一點;在質量(和尺寸)方面,它與每像素RGB三元組相同。實際的8位圖像字面上每個像素只有一個字節,這不足以保存有意義的RGB信息,因此8bpp或更低的圖像[被_always_索引](https://msdn.microsoft.com/zh-cn/library /system.drawing.imaging.pixelformat)。這與它保存的文件類型完全無關;你也可以擁有8位的BMP或PNG,並且它是一樣的。 – Nyerguds
更改爲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
方法。
轉換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;
}
儘管可以轉換爲_grayscale_ 8位。實際的顏色減少比較困難。 – Nyerguds
- 1. 轉換32位rgb圖像爲8位rgb C++
- 2. MATLAB/Opencv:將24位RGB圖像轉換爲16位灰色
- 3. 將css顏色轉換爲16位rgb
- 4. 如何將24位RGB轉換爲8位RGB
- 5. 16位RGB到3位RGB
- 6. 使用OpenCV將12位拜耳圖像轉換爲8位RGB
- 7. 工具從16位RGB轉換爲24位RGB,反之亦然
- 8. 將8位顏色轉換爲RGB值
- 9. Winforms的RGB圖像灰度8位和16位
- 10. PIL:將RGB圖像轉換爲特定的8位調色板?
- 11. 24位圖圖像和16位圖圖像中的RGB顏色
- 12. 將BGR位圖轉換爲RGB
- 13. 在VB中將位圖轉換爲RGB
- 14. 如何將16位灰度圖像轉換爲java中的RGB圖像?
- 15. 轉換24位圖像RGB到3位8色
- 16. OpenCV與RGB 16位
- 17. 將RGB圖像轉換爲灰度和灰度轉換爲RGB圖像?
- 18. DICOM將16位轉換爲8位
- 19. 將24位RGB轉換爲ARGB16
- 20. RGB轉換到X和Y位圖
- 21. 手動將RGB RGB圖像轉換爲灰度圖
- 22. 編碼16位RGB顏色
- 23. 如何使用Java在ImageJ2中將圖像從8位轉換爲RGB
- 24. Java for ImageJ。如何使用代碼將圖像從RGB轉換爲8位?
- 25. RGB 24位到16位顏色轉換 - 顏色變暗
- 26. 如何將索引圖像轉換爲Java中的RGB圖像?
- 27. 將像素值轉換爲RGB格式
- 28. 將RGB圖像轉換成位圖誤差在2.2
- 29. 8位到16位轉換
- 30. 16位圖像轉換爲32位
谷歌發現了這個,也許是有用的? http://www.codeproject.com/Articles/17162/Fast-Color-Depth-Change-for-Bitmaps –