Tôi đã tìm kiếm một chút và nếu chúng ta bỏ qua khả năng rằng các mảng không phải là kích thước thích hợp, chúng tôi kết thúc trong Remarks for BitmapData.Stride Property:
Các sải chân là chiều rộng của một hàng duy nhất của pixel (quét dòng), được làm tròn thành ranh giới bốn byte. Nếu sải chân là dương, thì bitmap là từ trên xuống. Nếu sải chân là âm, bitmap là từ dưới lên.
Vì vậy, có lẽ chúng ta nên làm điều đó theo cách này:
BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.WriteOnly, bmp.PixelFormat);
Marshal.Copy(myByteArray, 0, bmpData.Scan0 +
(bmpData.Stride >= 0 ? 0 : bmpData.Stride*(bmp.Height-1)),
myByteArray.Length);
Nhưng tôi tự hỏi: Chúng tôi đã tạo bitmap: new Bitmap(Width, Height, PixelFormat.Format24bppRgb);
... như vậy, thế nào có thể nó có thể được tiêu cực?
Thời ILSpy:
public Bitmap(int width, int height, PixelFormat format)
{
IntPtr zero = IntPtr.Zero;
int num = SafeNativeMethods.Gdip.GdipCreateBitmapFromScan0(width, height, 0, (int)format, NativeMethods.NullHandleRef, out zero);
if (num != 0)
{
throw SafeNativeMethods.Gdip.StatusException(num);
}
base.SetNativeImage(zero);
}
// System.Drawing.SafeNativeMethods.Gdip
[DllImport("gdiplus.dll", CharSet = CharSet.Unicode, ExactSpelling = true, SetLastError = true)]
internal static extern int GdipCreateBitmapFromScan0(int width, int height, int stride, int format, HandleRef scan0, out IntPtr bitmap);
Và nó chỉ cho tôi here và here:
Bitmap(
[in] INT width,
[in] INT height,
[in] INT stride,
[in] PixelFormat format,
[in] BYTE *scan0
);
sải chân [trong]
Loại: INT
Integer chỉ định byte bù đắp giữa bắt đầu của một dòng quét và tiếp theo. Đây thường là (nhưng không nhất thiết) số lượng byte ở định dạng pixel (ví dụ: 2 cho 16 bit trên mỗi pixel) nhân với chiều rộng của bitmap. Giá trị được chuyển đến thông số này phải là bội số của bốn.
Ý nghĩa của việc vượt qua 0 là gì? Không biết, không thể tìm thấy. Có ai không? Bitmap có thể được tạo ra với bước tiến tiêu cực không? (bởi .NET new Bitmap(Width, Height, PixelFormat.Format24bppRgb)
). Trong mọi trường hợp, , chúng tôi cần ít nhất kiểm tra BitmapData.Stride.
Không chắc, nhưng bạn có thể thử đặt một khóa xung quanh 'LockBits' và 'UnlockBits'. Khi tuyên bố này khóa bitmap trên bộ nhớ hệ thống. Và bạn ngoại lệ cho phép truy cập không hợp lệ vào bộ nhớ được bảo vệ. – Savaratkar