我有一個jpeg圖像。我將這個bitmapdata保存到一個字節數組中。從圖像字節數組中讀取像素
此JPEG具有100的寬度和100
我想提取Rectanlge的圖像(10,10,20,20)的高度;
顯然,我可以通過這個字節數組進行交互,但我不確定如何將我想要的x,y像素與這個字節數組關聯起來。我知道我必須使用步幅和像素大小,因爲它是rgba。
我有這個這是從這個鏈接cropping an area from BitmapData with C#。
Bitmap bmp = new Bitmap(_file);
Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
BitmapData rawOriginal = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppRgb);
int origByteCount = rawOriginal.Stride * rawOriginal.Height;
byte[] origBytes = new Byte[origByteCount];
System.Runtime.InteropServices.Marshal.Copy(rawOriginal.Scan0, origBytes, 0, origByteCount);
int BPP = 4;
int width = 20;
int height = 20;
int startX = 10;
int startY = 10;
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width * BPP; j += BPP)
{
int origIndex = (startX * rawOriginal.Stride) + (i * rawOriginal.Stride) + (startY * BPP) + (j);
int croppedIndex = (i * width * BPP) + (j);
//copy data: once for each channel
for (int k = 0; k < BPP; k++)
{
croppedBytes[croppedIndex + k] = origBytes[origIndex + k];
}
}
}
但這:
int origIndex = (startX * rawOriginal.Stride) + (i * rawOriginal.Stride) + (startY * BPP) + (j);
我發現不正確。
有人知道我應該在這裏設置什麼樣的價值嗎?
感謝
「這裏是4 *寬度」 - 不太完美,請注意''Stride'不是**總是'BPP * Width'。可能有一些填充取決於寬度,請參閱:http://stackoverflow.com/a/5736076/360211 – weston
@weston這是真的,但不適用於32位圖像(至少現在),所以這裏確實是'4 *寬度。我不認爲位圖操作類是針對64位處理器進行了優化的,這就是爲什麼我非常懷疑可以填充32位圖像的問題。 – ppetrov
哦,是的,我糾正了(對於32位圖像)。 – weston