图像处理中Stride方法理解

一行有 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; 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值