原文地址 http://blog.sina.com.cn/s/blog_7155fb1a0100sbkr.html
一行有 11 个像素(Width = 11), 对一个 32 位(每个像素 4 字节)的图像, Stride = 11 * 4 = 44.
但还有个字节对齐的问题, 譬如:
一行有 11 个像素(Width = 11), 对一个 24 位(每个像素 3 字节)的图像, Stride = 11 * 3 + 3 = 36.
为什么不是 Stride = 33? 因为它是按 4 字节对齐的.
根据上面道理, 我们可以手动计算 Stride 的值:
1、Stride = 每像素占用的字节数(也就是像素位数/8) * Width;
2、如果 Stride 不是 4 的倍数, 那么 Stride = Stride + (4 - Stride mod 4);
下面的例子测试和验证了上面的思路:
uses GdiPlus;
procedure TForm1.FormPaint(Sender: TObject);
var
Bitmap: IGPBitmap;
Rect: TGPRect;
Graphics: IGPGraphics;
Data: TGPBitmapData;
n: Integer;
begin
ChDir('C:\GdiPlusImg\');
Bitmap := TGPBitmap.Create('Grapes.jpg');
Rect.Initialize(0, 0, Bitmap.Width, Bitmap.Height);
Data := Bitmap.LockBits(Rect, [ImageLockModeRead], Bitmap.PixelFormat);
n := GetPixelFormatSize(Data.PixelFormat) div 8 * Data.Width;
n := n + (4 - n mod 4);
ShowMessageFmt('%d, %d, %d', [Data.Width, Data.Stride, n]); { 187, 564, 564 }
Bitmap.UnlockBits(Data);
//
Bitmap := TGPBitmap.Create('Bird.bmp');
Rect.Initialize(0, 0, Bitmap.Width, Bitmap.Height);
Data := Bitmap.LockBits(Rect, [ImageLockModeRead], Bitmap.PixelFormat);
n := GetPixelFormatSize(Data.PixelFormat) div 8 * Data.Width;
if n mod 4 <> 0 then n := n + (4 - n mod 4);
ShowMessageFmt('%d, %d, %d', [Data.Width, Data.Stride, n]); { 110, 112, 112 }
Bitmap.UnlockBits(Data);
//
Bitmap := TGPBitmap.Create('Apple.gif');
Rect.Initialize(0, 0, Bitmap.Width, Bitmap.Height);
Data := Bitmap.LockBits(Rect, [ImageLockModeRead], Bitmap.PixelFormat);
n := GetPixelFormatSize(Data.PixelFormat) div 8 * Data.Width;
if n mod 4 <> 0 then n := n + (4 - n mod 4);
ShowMessageFmt('%d, %d, %d', [Data.Width, Data.Stride, n]); { 120, 120, 120 }
Bitmap.UnlockBits(Data);
//
Bitmap := TGPBitmap.Create('ImageFileSmall.jpg');
Rect.Initialize(0, 0, Bitmap.Width, Bitmap.Height);
Data := Bitmap.LockBits(Rect, [ImageLockModeRead], Bitmap.PixelFormat);
n := GetPixelFormatSize(Data.PixelFormat) div 8 * Data.Width;
if n mod 4 <> 0 then n := n + (4 - n mod 4);
ShowMessageFmt('%d, %d, %d', [Data.Width, Data.Stride, n]); { 320, 960, 960 }
Bitmap.UnlockBits(Data);
end;