說我有位圖圖像,是否可以遍歷圖像中的所有單個字節?如果是,如何?如何訪問位圖圖像中的每個字節
3
A
回答
6
我發現這一點:http://channel9.msdn.com/forums/TechOff/108813-Bitmap-to-byte-array/
說,你可以使用一個MemoryStream和.Save方法它會是這樣的:
System.Drawing.Bitmap bmp = GetTheBitmap();
System.IO.MemoryStream stream = new System.IO.MemoryStream();
bmp.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp);
stream.Position = 0;
byte[] data = new byte[stream.Length];
stream.Read(data, 0, stream.Length);
4
上Bitmap類使用LockBits成員獲得的BitmapData,然後使用Scan0和Marshal.ReadByte來讀取字節。下面是小例子(它是不是正確的亮度調整,雖然):
public static void AdjustBrightness(Bitmap image, int brightness)
{
int offset = 0;
brightness = (brightness * 255)/100;
// GDI+ still lies to us - the return format is BGR, NOT RGB.
BitmapData bmData = image.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
int stride = bmData.Stride;
IntPtr Scan0 = bmData.Scan0;
int nVal = 0;
int nOffset = stride - image.Width * 3;
int nWidth = image.Width * 3;
for (int y = 0; y < image.Height; ++y)
{
for (int x = 0; x < nWidth; ++x)
{
nVal = Marshal.ReadByte(Scan0, offset) + brightness;
if (nVal < 0)
nVal = 0;
if (nVal > 255)
nVal = 255;
Marshal.WriteByte(Scan0, offset, (byte)nVal);
++offset;
}
offset += nOffset;
}
image.UnlockBits(bmData);
}
4
如果您需要訪問的像素信息,超慢,但超簡單的方法是在調用與getPixel和SetPixel方法你的Bitmap對象。
超快而且不那麼困難的方法是調用Bitmap的LockBits方法,並使用它返回的BitmapData對象直接讀寫Bitmap的字節數據。你可以做的Marshal類後者部分在伊利亞的例子,也可以跳過元帥開銷是這樣的:
BitmapData data;
int x = 0; //or whatever
int y = 0;
unsafe
{
byte* row = (byte*)data.Scan0 + (y * data.Stride);
int columnOffset = x * 4;
byte B = row[columnOffset];
byte G = row[columnOffset + 1];
byte R = row[columnOffset + 2];
byte A = row[columnOffset + 3];
}
0
另一種解決方案是使用LockBits和Marshal.Copy你的位圖轉換成一個數組。我需要這種解決方案,因爲我有兩張只在顏色深度上有差異的圖像,其他提供的解決方案處理得不好(或太慢)。
using (Bitmap bmp = new Bitmap(fname)) {
// Convert image to int32 array with each int being one pixel
int cnt = bmp.Width * bmp.Height * 4/4;
BitmapData bmData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),
ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
Int32[] rgbValues = new Int32[cnt];
// Copy the RGB values into the array.
System.Runtime.InteropServices.Marshal.Copy(bmData.Scan0, rgbValues, 0, cnt);
bmp.UnlockBits(bmData);
for (int i = 0; i < cnt; ++i) {
if (rgbValues[i] == 0xFFFF0000)
Console.WriteLine ("Red byte");
}
}
相關問題
- 1. 如何訪問Android上的位圖圖像的像素?
- 2. 如何訪問RGB圖像的每個像素值?
- 3. 如何從swift中的字節數組創建位圖圖像
- 4. 如何訪問圖庫中圖像的位置?
- 5. 如何將每個字節代表4像素(每像素2位)的19200字節大小的字節數組轉換爲320x240字符的位圖
- 6. Android中圖像字節表示的字節每像素值
- 7. 如何訪問每一個圖像像素,MATLAB
- 8. 將字節轉換爲位圖圖像
- 9. 字節數組圖像到位圖
- 10. 字節數組到位圖圖像
- 11. 如何訪問整數指針中的每個字節?
- 12. 如何連接圖像上的字圖像中的每個段的繪圖點
- 13. 從Android Studio中的攝像頭訪問位圖圖像
- 14. 繪製位圖與不安全的每像素訪問結果爲空圖像
- 15. 如何訪問C中給定一個字節的特定位?
- 16. 如何訪問instagram圖像
- 17. 如何訪問每個圖像塊進行小波變換
- 18. 如何從灰度字節緩衝區圖像創建位圖?
- 19. 如何訪問rails 3.1中的圖像?
- 20. 如何使array_walk_recursive訪問每個節點?
- 21. 訪問ARCore中的圖像數據字節
- 22. 如何從原始Bayer圖像數據(字節數組)獲取位圖圖像?
- 23. 訪問圖中的每個鏈表(java.util)
- 24. WordPress的 - 每個職位多個圖像
- 25. 如何在每個圖像
- 26. 問題訪問/編輯Mat圖像中的像素位置
- 27. 獲取高位圖柱形圖中每個小節的終點
- 28. 從每個通道(每像素128位)的位圖寫入圖像.net
- 29. 計算圖中每個節點的距離爲n的未訪問節點
- 30. 如何從字節中定位圖像Android
你的意思是像素? – grieve 2008-12-03 16:02:28