hImage 为存放位图的 内存空间,是一个指向字节类型的指针。
请教各位,上面这个公式是什么意思?
尤其*(DWORD*)hImage 的作用是什么?
为什么 还将(BYTE*)hImage 和 *(DWORD*)hImage 加起来?
13 个解决方案
#1
hImage 的前4个字节有重要信息?
#2
还有这样的公式?这个公式是从哪里弄来的?
BYTE* pbBits = (BYTE*)hImage + *(DWORD*)hImage
(DWORD*)hImage 将hImage转换为DWORD类型指针
*(DWORD*)hImage 得到hImage(作为指针,假设成立)头4个字节值x
BYTE* pbBits = (BYTE*)hImage + *(DWORD*)hImage hImage指针值,加上偏移量x 作为pbBits 指针的值
BYTE* pbBits = (BYTE*)hImage + *(DWORD*)hImage
(DWORD*)hImage 将hImage转换为DWORD类型指针
*(DWORD*)hImage 得到hImage(作为指针,假设成立)头4个字节值x
BYTE* pbBits = (BYTE*)hImage + *(DWORD*)hImage hImage指针值,加上偏移量x 作为pbBits 指针的值
#3
这种Image 实际数据位于hImage后面某个位置,
其中hImage位置是一个DWORD类型的偏移量。
实际数据,相对hImage的偏移量,就是该偏移量。
其中hImage位置是一个DWORD类型的偏移量。
实际数据,相对hImage的偏移量,就是该偏移量。
#4
*(DWORD*)himage的意思是把himage指向的内存的前4个字节当成一个DWORD值返回,结果是一个DWORD值。
(BYTE*)himage+ XXX 是计算从himage向后相隔XXX个字节的内存地址。
整个的意思是,himage指向一个数据结构,其中最前边是HEADER, 后边是(位图像素)数据。HEADER的前4个字节是整个HEADER的长度, 这样pbBits计算出来就是指向(位图像素)数据的指针了
(BYTE*)himage+ XXX 是计算从himage向后相隔XXX个字节的内存地址。
整个的意思是,himage指向一个数据结构,其中最前边是HEADER, 后边是(位图像素)数据。HEADER的前4个字节是整个HEADER的长度, 这样pbBits计算出来就是指向(位图像素)数据的指针了
#5
代码太多了,我只列出部分关键的代码吧
bool Kirsch(HANDLE hImage)
{
。。。。。。
int effwdt = ((((ds.biBitCount * ds.biWidth ) + 31) / 32) * 4);
BYTE* pbBits = (BYTE*)hImage + *(DWORD*)hImage + ds.biClrUsed * sizeof(RGBQUAD);
。。。。。
}
其中hImage 是位图图像的数据,只是数据,没有文件头,信息头,颜色表等。函数Kirsch是对图像数据做一些处理。我的理解是:直接读取hImage的数据,进行处理即可。但是,这段代码里,确实这样处理,实在令人费解!感谢楼上的几位的回复,我还是没有想通。。。
bool Kirsch(HANDLE hImage)
{
。。。。。。
int effwdt = ((((ds.biBitCount * ds.biWidth ) + 31) / 32) * 4);
BYTE* pbBits = (BYTE*)hImage + *(DWORD*)hImage + ds.biClrUsed * sizeof(RGBQUAD);
。。。。。
}
其中hImage 是位图图像的数据,只是数据,没有文件头,信息头,颜色表等。函数Kirsch是对图像数据做一些处理。我的理解是:直接读取hImage的数据,进行处理即可。但是,这段代码里,确实这样处理,实在令人费解!感谢楼上的几位的回复,我还是没有想通。。。
#6
你上当了
只是没有文件头,
信息头,颜色表全部都有,只是他把这些数据放到一起了。
哦,有可能也有文件头的一部分;
比如 *(DWORD*)hImage 这个偏移量,
在位图文件中,就位于文件头,是文件头的最后一个数据。
typedef struct tagBITMAPFILEHEADER { // bmfh
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits; //这个成员,就相当于*(DWORD*)hImage
} BITMAPFILEHEADER;
具体的说 bfOffBits -sizeof(tagBITMAPFILEHEADER) +sizeof(DWORD) 就等于 *(DWORD*)hImage
只是没有文件头,
信息头,颜色表全部都有,只是他把这些数据放到一起了。
哦,有可能也有文件头的一部分;
比如 *(DWORD*)hImage 这个偏移量,
在位图文件中,就位于文件头,是文件头的最后一个数据。
typedef struct tagBITMAPFILEHEADER { // bmfh
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits; //这个成员,就相当于*(DWORD*)hImage
} BITMAPFILEHEADER;
具体的说 bfOffBits -sizeof(tagBITMAPFILEHEADER) +sizeof(DWORD) 就等于 *(DWORD*)hImage
#7
哦,上面说的可能,不太对头。
信息头,颜色表和数据,他全都有了。
只是没有文件头
*(DWORD*)hImage 表示数据的实际位置。
信息头,颜色表和数据,他全都有了。
只是没有文件头
*(DWORD*)hImage 表示数据的实际位置。
#8
BYTE* pbBits = (BYTE*)hImage + *(DWORD*)hImage;
意思就是
pbBits指针等于hImage指针加上hImage前4个字节的内容
如:
hImage的指针内容:
07 00 00 00 06 21 11 01 02 03 04 ....
BYTE* pbBits = (BYTE*)hImage + 7;
pbBits的指针内容就是:
01 02 03 04 ....
意思就是
pbBits指针等于hImage指针加上hImage前4个字节的内容
如:
hImage的指针内容:
07 00 00 00 06 21 11 01 02 03 04 ....
BYTE* pbBits = (BYTE*)hImage + 7;
pbBits的指针内容就是:
01 02 03 04 ....
#9
*(DWORD *)A等价于((DWORD *)A)[0]
#10
这里 biClrUsed=0
BYTE* pbBits = (BYTE*)pBmpBuf + *(DWORD*)pBmpBuf + biClrUsed * sizeof(RGBQUAD);
等同于 BYTE* pbBits = (BYTE*)pBmpBuf;
通过调试程序,监测变量是这样的结果
*(DWORD*)pBmpBuf 为0,(DWORD*)pBmpBuf 与 pBmpBuf 相同的地址,这个不难理解了,但是为什么*(DWORD*)pBmpBuf 为0 呢?我的这个pBmpBuf 是纯数据,不含文件头,信息头,颜色表等,是从位图中读出的纯数据
BYTE* pbBits = (BYTE*)pBmpBuf + *(DWORD*)pBmpBuf + biClrUsed * sizeof(RGBQUAD);
等同于 BYTE* pbBits = (BYTE*)pBmpBuf;
通过调试程序,监测变量是这样的结果
*(DWORD*)pBmpBuf 为0,(DWORD*)pBmpBuf 与 pBmpBuf 相同的地址,这个不难理解了,但是为什么*(DWORD*)pBmpBuf 为0 呢?我的这个pBmpBuf 是纯数据,不含文件头,信息头,颜色表等,是从位图中读出的纯数据
#11
还有,
某个函数 aaaa(HANDLE pBmpBuf,int bmpWidth,int bmpHeight,int biBitCount)
这里的 HANDLE pBmpBuf 是什么意思呢? 难道也是 声明一个指针?
某个函数 aaaa(HANDLE pBmpBuf,int bmpWidth,int bmpHeight,int biBitCount)
这里的 HANDLE pBmpBuf 是什么意思呢? 难道也是 声明一个指针?
#12
。。。。。这个逻辑大概是有问题的把?
hImage 的第一个字节+hImage 的前4个字节,这个数据明显重叠了,难道故意这样设计的么?
hImage 的第一个字节+hImage 的前4个字节,这个数据明显重叠了,难道故意这样设计的么?
#13
晕看错,无视12楼
#1
hImage 的前4个字节有重要信息?
#2
还有这样的公式?这个公式是从哪里弄来的?
BYTE* pbBits = (BYTE*)hImage + *(DWORD*)hImage
(DWORD*)hImage 将hImage转换为DWORD类型指针
*(DWORD*)hImage 得到hImage(作为指针,假设成立)头4个字节值x
BYTE* pbBits = (BYTE*)hImage + *(DWORD*)hImage hImage指针值,加上偏移量x 作为pbBits 指针的值
BYTE* pbBits = (BYTE*)hImage + *(DWORD*)hImage
(DWORD*)hImage 将hImage转换为DWORD类型指针
*(DWORD*)hImage 得到hImage(作为指针,假设成立)头4个字节值x
BYTE* pbBits = (BYTE*)hImage + *(DWORD*)hImage hImage指针值,加上偏移量x 作为pbBits 指针的值
#3
这种Image 实际数据位于hImage后面某个位置,
其中hImage位置是一个DWORD类型的偏移量。
实际数据,相对hImage的偏移量,就是该偏移量。
其中hImage位置是一个DWORD类型的偏移量。
实际数据,相对hImage的偏移量,就是该偏移量。
#4
*(DWORD*)himage的意思是把himage指向的内存的前4个字节当成一个DWORD值返回,结果是一个DWORD值。
(BYTE*)himage+ XXX 是计算从himage向后相隔XXX个字节的内存地址。
整个的意思是,himage指向一个数据结构,其中最前边是HEADER, 后边是(位图像素)数据。HEADER的前4个字节是整个HEADER的长度, 这样pbBits计算出来就是指向(位图像素)数据的指针了
(BYTE*)himage+ XXX 是计算从himage向后相隔XXX个字节的内存地址。
整个的意思是,himage指向一个数据结构,其中最前边是HEADER, 后边是(位图像素)数据。HEADER的前4个字节是整个HEADER的长度, 这样pbBits计算出来就是指向(位图像素)数据的指针了
#5
代码太多了,我只列出部分关键的代码吧
bool Kirsch(HANDLE hImage)
{
。。。。。。
int effwdt = ((((ds.biBitCount * ds.biWidth ) + 31) / 32) * 4);
BYTE* pbBits = (BYTE*)hImage + *(DWORD*)hImage + ds.biClrUsed * sizeof(RGBQUAD);
。。。。。
}
其中hImage 是位图图像的数据,只是数据,没有文件头,信息头,颜色表等。函数Kirsch是对图像数据做一些处理。我的理解是:直接读取hImage的数据,进行处理即可。但是,这段代码里,确实这样处理,实在令人费解!感谢楼上的几位的回复,我还是没有想通。。。
bool Kirsch(HANDLE hImage)
{
。。。。。。
int effwdt = ((((ds.biBitCount * ds.biWidth ) + 31) / 32) * 4);
BYTE* pbBits = (BYTE*)hImage + *(DWORD*)hImage + ds.biClrUsed * sizeof(RGBQUAD);
。。。。。
}
其中hImage 是位图图像的数据,只是数据,没有文件头,信息头,颜色表等。函数Kirsch是对图像数据做一些处理。我的理解是:直接读取hImage的数据,进行处理即可。但是,这段代码里,确实这样处理,实在令人费解!感谢楼上的几位的回复,我还是没有想通。。。
#6
你上当了
只是没有文件头,
信息头,颜色表全部都有,只是他把这些数据放到一起了。
哦,有可能也有文件头的一部分;
比如 *(DWORD*)hImage 这个偏移量,
在位图文件中,就位于文件头,是文件头的最后一个数据。
typedef struct tagBITMAPFILEHEADER { // bmfh
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits; //这个成员,就相当于*(DWORD*)hImage
} BITMAPFILEHEADER;
具体的说 bfOffBits -sizeof(tagBITMAPFILEHEADER) +sizeof(DWORD) 就等于 *(DWORD*)hImage
只是没有文件头,
信息头,颜色表全部都有,只是他把这些数据放到一起了。
哦,有可能也有文件头的一部分;
比如 *(DWORD*)hImage 这个偏移量,
在位图文件中,就位于文件头,是文件头的最后一个数据。
typedef struct tagBITMAPFILEHEADER { // bmfh
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits; //这个成员,就相当于*(DWORD*)hImage
} BITMAPFILEHEADER;
具体的说 bfOffBits -sizeof(tagBITMAPFILEHEADER) +sizeof(DWORD) 就等于 *(DWORD*)hImage
#7
哦,上面说的可能,不太对头。
信息头,颜色表和数据,他全都有了。
只是没有文件头
*(DWORD*)hImage 表示数据的实际位置。
信息头,颜色表和数据,他全都有了。
只是没有文件头
*(DWORD*)hImage 表示数据的实际位置。
#8
BYTE* pbBits = (BYTE*)hImage + *(DWORD*)hImage;
意思就是
pbBits指针等于hImage指针加上hImage前4个字节的内容
如:
hImage的指针内容:
07 00 00 00 06 21 11 01 02 03 04 ....
BYTE* pbBits = (BYTE*)hImage + 7;
pbBits的指针内容就是:
01 02 03 04 ....
意思就是
pbBits指针等于hImage指针加上hImage前4个字节的内容
如:
hImage的指针内容:
07 00 00 00 06 21 11 01 02 03 04 ....
BYTE* pbBits = (BYTE*)hImage + 7;
pbBits的指针内容就是:
01 02 03 04 ....
#9
*(DWORD *)A等价于((DWORD *)A)[0]
#10
这里 biClrUsed=0
BYTE* pbBits = (BYTE*)pBmpBuf + *(DWORD*)pBmpBuf + biClrUsed * sizeof(RGBQUAD);
等同于 BYTE* pbBits = (BYTE*)pBmpBuf;
通过调试程序,监测变量是这样的结果
*(DWORD*)pBmpBuf 为0,(DWORD*)pBmpBuf 与 pBmpBuf 相同的地址,这个不难理解了,但是为什么*(DWORD*)pBmpBuf 为0 呢?我的这个pBmpBuf 是纯数据,不含文件头,信息头,颜色表等,是从位图中读出的纯数据
BYTE* pbBits = (BYTE*)pBmpBuf + *(DWORD*)pBmpBuf + biClrUsed * sizeof(RGBQUAD);
等同于 BYTE* pbBits = (BYTE*)pBmpBuf;
通过调试程序,监测变量是这样的结果
*(DWORD*)pBmpBuf 为0,(DWORD*)pBmpBuf 与 pBmpBuf 相同的地址,这个不难理解了,但是为什么*(DWORD*)pBmpBuf 为0 呢?我的这个pBmpBuf 是纯数据,不含文件头,信息头,颜色表等,是从位图中读出的纯数据
#11
还有,
某个函数 aaaa(HANDLE pBmpBuf,int bmpWidth,int bmpHeight,int biBitCount)
这里的 HANDLE pBmpBuf 是什么意思呢? 难道也是 声明一个指针?
某个函数 aaaa(HANDLE pBmpBuf,int bmpWidth,int bmpHeight,int biBitCount)
这里的 HANDLE pBmpBuf 是什么意思呢? 难道也是 声明一个指针?
#12
。。。。。这个逻辑大概是有问题的把?
hImage 的第一个字节+hImage 的前4个字节,这个数据明显重叠了,难道故意这样设计的么?
hImage 的第一个字节+hImage 的前4个字节,这个数据明显重叠了,难道故意这样设计的么?
#13
晕看错,无视12楼