rgb32 1280x720 的位图 为什么pitch是7680 而不是5120

LIGA1998 2015-09-26 02:55:35
加精
我有一个RGBA 1280x720的位图,奇怪的是他的pitch却是7680,而不是1280x4 =5120,怎么转换成pitch是5120的位图
...全文
1147 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
dedekker 2016-02-29
  • 打赏
  • 举报
回复
非常感谢学习了
LIGA1998 2015-09-30
  • 打赏
  • 举报
回复
引用 18 楼 schlafenhamster 的回复:
// 纯位图数据长 3686400 = 0x384000/0x1E00 = 0x1E0 = 640 hei // 1280(Pix) + 640(Pad)=1920(pixels); *4(ARGB)=0x1E00 // width*hei = 1280*640 height 不是 720 !
因为我写文件的时候 写入大小是高x宽x4,这是错误的,应该是pitchx高,我已经意识到了,谢谢
schlafenhamster 2015-09-29
  • 打赏
  • 举报
回复
图是倒的 !改: bi.biHeight = -H;
schlafenhamster 2015-09-29
  • 打赏
  • 举报
回复

// 纯位图数据 3686400=0x384000/0x1E00=0x1E0=480 hei
// 1280(Pix) + 640(Pad)=1920(pixels); *4(ARGB)=0x1E00
// width*hei = 1280*480
#define W 1280
#define H 480
void LoadBigStride()
{
	CFile ifile;
	ifile.Open("纯位图数据",CFile::modeRead);
	CFile ofile;
	ofile.Open("位图数据.bmp",CFile::modeCreate | CFile::modeWrite);
//
	BITMAPFILEHEADER bmfHdr; //位图文件头结构 
// 设置位图文件头 
	bmfHdr.bfType = 0x4D42; // "BM" 
	DWORD dwDIBSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+W*H*4; 
	bmfHdr.bfSize = dwDIBSize; 
	bmfHdr.bfReserved1 = 0; 
	bmfHdr.bfReserved2 = 0; 
	bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER); 
// 写入位图文件头 
	ofile.Write((LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER)); 
// 设置位图信息头结构 
	BITMAPINFOHEADER bi;//位图信息头结构 
	bi.biSize = sizeof(BITMAPINFOHEADER); 
	bi.biWidth = W; 
	bi.biHeight = H; 
	bi.biPlanes = 1; 
	bi.biBitCount = 32; 
	bi.biCompression = BI_RGB; 
	bi.biSizeImage = 0;// bmfHdr.bfOffBits + 1280*640*4; 
	bi.biXPelsPerMeter = 0; 
	bi.biYPelsPerMeter = 0; 
	bi.biClrUsed = 0; 
	bi.biClrImportant = 0; 
//写入位图信息头 
	ofile.Write((LPSTR)&bi, sizeof(BITMAPINFOHEADER)); 
// 写入 pixels
	int hei=0;
	char ibuffer[0x1E00];
	while(ifile.Read(ibuffer,0x1E00))
	{
		ofile.Write(ibuffer,0x1400);
		hei ++;
	}
	afxDump << hei << "\n";
	ifile.Close();
	ofile.Close();
}
height = 0x1E0= 480 !!!
schlafenhamster 2015-09-29
  • 打赏
  • 举报
回复
// 纯位图数据长 3686400 = 0x384000/0x1E00 = 0x1E0 = 640 hei // 1280(Pix) + 640(Pad)=1920(pixels); *4(ARGB)=0x1E00 // width*hei = 1280*640 height 不是 720 !
LIGA1998 2015-09-28
  • 打赏
  • 举报
回复
引用 12 楼 schlafenhamster 的回复:
"我把它写成bmp文件了" 不要你改的 , 要 原始 文件!
没有改,只是加了bmp的文件头,没有所谓的原始文件,就是从api获取的纯位图数据 我再传个没有文件头的纯位图数据的文件给你 http://pan.baidu.com/s/1mgozfx2
schlafenhamster 2015-09-28
  • 打赏
  • 举报
回复
"我把它写成bmp文件了" 不要你改的 , 要 原始 文件!
LIGA1998 2015-09-28
  • 打赏
  • 举报
回复
读文件到一个
引用 16 楼 schlafenhamster 的回复:
|--------------pitch (stride)-----------------| 7680 |----------5120-----------------|--- pading ---| 2560 怎么大的 pading ??? 1280 Pixel 640 个 0
这确实奇葩,既然我知道了它的排列,我就知道怎么处理了,非常感谢你的分析
schlafenhamster 2015-09-28
  • 打赏
  • 举报
回复
|--------------pitch (stride)-----------------| 7680 |----------5120-----------------|--- pading ---| 2560 怎么大的 pading ??? 1280 Pixel 640 个 0
schlafenhamster 2015-09-28
  • 打赏
  • 举报
回复
16进制 显示: 0-》D6FFF 有 数据 ( 4个 字节 一组) D7000-》D7944 (2372 字节)都为 0 ! 你 那个 1280*720 是 怎么算出来 的 ?
schlafenhamster 2015-09-28
  • 打赏
  • 举报
回复
下载了,看看再说
LIGA1998 2015-09-27
  • 打赏
  • 举报
回复
引用 10 楼 worldy 的回复:
应该是 w*h*(R+G+B) RGB分别2字节吧
是1字节,问题在于排列,我还要1600x900分辨率的pitch也是7680
worldy 2015-09-27
  • 打赏
  • 举报
回复
应该是 w*h*(R+G+B) RGB分别2字节吧
LIGA1998 2015-09-27
  • 打赏
  • 举报
回复
引用 8 楼 schlafenhamster 的回复:
请 上传 那个 “RGBA 1280x720的位图”
http://pan.baidu.com/s/1hqexP8w 我把它写成bmp文件了,系统自带的图片查看器打开是显示花屏的
schlafenhamster 2015-09-27
  • 打赏
  • 举报
回复
请 上传 那个 “RGBA 1280x720的位图”
LIGA1998 2015-09-27
  • 打赏
  • 举报
回复
引用 6 楼 A119669 的回复:
[quote=引用 4 楼 schlafenhamster 的回复:] https://msdn.microsoft.com/en-us/library/windows/desktop/aa473780(v=vs.85).aspx
我参考MSDN里面的,写了如下方法,但他并不能用,报错,求解,感激不尽

	void ProcessVideoImage(BYTE** pDestScanLine0,LONG lDestStride,BYTE** pSrcScanLine0,LONG lSrcStride,DWORD dwWidthInPixels,DWORD dwHeightInPixels)
	{
		for (DWORD y = 0; y < dwHeightInPixels; y++)
		{
			RGBQUAD* pSrcPixel = (RGBQUAD*) *pDestScanLine0;
			RGBQUAD* pDestPixel = (RGBQUAD*) *pSrcScanLine0;

			for (DWORD x = 0; x < dwWidthInPixels; x += 2)
			{
				pDestPixel[x] = pSrcPixel[x];
			}
			*pDestScanLine0 += lDestStride;
			*pSrcScanLine0 += lSrcStride;
		}
	}
[/quote] ProcessVideoImage(&Picture_data2, param.i_width * 4, &Picture_data, Picture_pitch, param.i_width, param.i_height); 参数是这样
LIGA1998 2015-09-27
  • 打赏
  • 举报
回复
引用 4 楼 schlafenhamster 的回复:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa473780(v=vs.85).aspx
我参考MSDN里面的,写了如下方法,但他并不能用,报错,求解,感激不尽

	void ProcessVideoImage(BYTE** pDestScanLine0,LONG lDestStride,BYTE** pSrcScanLine0,LONG lSrcStride,DWORD dwWidthInPixels,DWORD dwHeightInPixels)
	{
		for (DWORD y = 0; y < dwHeightInPixels; y++)
		{
			RGBQUAD* pSrcPixel = (RGBQUAD*) *pDestScanLine0;
			RGBQUAD* pDestPixel = (RGBQUAD*) *pSrcScanLine0;

			for (DWORD x = 0; x < dwWidthInPixels; x += 2)
			{
				pDestPixel[x] = pSrcPixel[x];
			}
			*pDestScanLine0 += lDestStride;
			*pSrcScanLine0 += lSrcStride;
		}
	}
LIGA1998 2015-09-27
  • 打赏
  • 举报
回复
引用 2 楼 Trent1985 的回复:
除非你的排列方式不同http://blog.csdn.net/a102111/article/details/9326785
确实是排列问题,问题是如何转换
Trent1985 2015-09-26
  • 打赏
  • 举报
回复
7680/1280=6,这说明你的RGBA排列是需要6个字节的,而不是4个字节!
加载更多回复(2)

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧