我想获得每个像素点的像素值,一开始我是这样写的,用的是GDI+
for( int i=0; i<_nHeight; i++ )
{
for( int j=0; j<_nWidth; j++ )
{
xx[_nHeight-1-i][j] = *( m_pDib+i*lineByte+j );
}
}但是只能获得我电脑上原来就是灰度图像的一个图片,用我自己转的灰度图片的话得到的x[i][j]的值都是0.
后来我想干脆在转灰度的时候就获得每个像素点的值就好了,用的DIB的方法,把一个彩色图像转换成灰度图像的同时存储每个像素点的值for( i=0; i<m_nHeight; i++)
{
for( int j=0; j<m_nWidth; j++)
{ *( pImgDataOut+i*lineByteOut+j )=
0.11**( pImgDataIn+i*lineByteIn+j*pixelByteIn+0 )
+0.59**( pImgDataIn+i*lineByteIn+j*pixelByteIn+1 )
+0.30**( pImgDataIn+i*lineByteIn+j*pixelByteIn+2 )+0.5;
xx[m_nHeight-1-i][j] = *( pImgDataOut+i*lineByteOut+j );
}
}但是单步调试的时候发现x[i][j]的值,仍然都是0,我就很奇怪了,明明已经转成灰度图像了啊,为什么每个像素点的值会为0呢?还是我哪里搞错了。 因为我拿电脑上一张原始就是灰度图像的图片和一个用matlab转成的灰度图片读进来的话都没有问题。我想问问究竟是怎么回事呢?
for( int i=0; i<_nHeight; i++ )
{
for( int j=0; j<_nWidth; j++ )
{
xx[_nHeight-1-i][j] = *( m_pDib+i*lineByte+j );
}
}但是只能获得我电脑上原来就是灰度图像的一个图片,用我自己转的灰度图片的话得到的x[i][j]的值都是0.
后来我想干脆在转灰度的时候就获得每个像素点的值就好了,用的DIB的方法,把一个彩色图像转换成灰度图像的同时存储每个像素点的值for( i=0; i<m_nHeight; i++)
{
for( int j=0; j<m_nWidth; j++)
{ *( pImgDataOut+i*lineByteOut+j )=
0.11**( pImgDataIn+i*lineByteIn+j*pixelByteIn+0 )
+0.59**( pImgDataIn+i*lineByteIn+j*pixelByteIn+1 )
+0.30**( pImgDataIn+i*lineByteIn+j*pixelByteIn+2 )+0.5;
xx[m_nHeight-1-i][j] = *( pImgDataOut+i*lineByteOut+j );
}
}但是单步调试的时候发现x[i][j]的值,仍然都是0,我就很奇怪了,明明已经转成灰度图像了啊,为什么每个像素点的值会为0呢?还是我哪里搞错了。 因为我拿电脑上一张原始就是灰度图像的图片和一个用matlab转成的灰度图片读进来的话都没有问题。我想问问究竟是怎么回事呢?
BYTE *pDataBuf = new BYTE[nWidth * nHeight];
BYTE color[3];
for(int i=0;i< nHeight;i++)
{
for(int j=0;j< nWidth;j++)
{
for(int k=0; k<3; k++)
color[k]= pBmpBuf[(i* nWidth +j)*3+k];
pDataBuf[(i*nWidth)+j] = BYTE(color[0]*0.114+color[1]*0.587+color[2]*0.299);
if(pDataBuf[(i*nWidth)+j]>255)
pDataBuf[(i*nWidth)+j]=255;
}
}
i = 0.1*100;
printf("%d\n", i);
加一个类型转换试试
Procedure.l GrayBlt(hDCDst.l, *rectDst.RECT, hBmpSrc.l)
;获得源位图属性
bmp.BITMAP
GetObject_(hBmpSrc, SizeOf(BITMAP), @bmp)
;源位图像素位转换为 DIB
bmpinfo.BITMAPINFO
With bmpinfo\bmiHeader
\biSize = SizeOf(BITMAPINFOHEADER)
\biWidth = bmp\bmWidth
\biHeight = bmp\bmHeight
\biPlanes = 1
\biBitCount = 32
\biCompression = #BI_RGB
EndWith
cbPerLine.l = BytesPerScanLine(bmpinfo\bmiHeader\biWidth, bmpinfo\bmiHeader\biBitCount)
Dim bBits.b(bmp\bmHeight - 1, cbPerLine - 1)
GetDIBits_(hDCDst, hBmpSrc, 0, bmp\bmHeight, @bBits(0, 0), @bmpinfo, #DIB_RGB_COLORS) ;把每个像素设置为灰色值
bGray.b
Define.l i, j, k
For j = 0 To bmp\bmHeight - 1
For i = 0 To bmp\bmWidth - 1
k = i * 4
bGray = (bBits(j, k) & $ff * 29 + bBits(j, k + 1) & $ff * 150 + bBits(j, k + 2) & $ff * 77 + 128) / 256
bBits(j, k) = bGray
bBits(j, k + 1) = bGray
bBits(j, k + 2) = bGray
Next i
Next j
;将设好的位绘制到目标 DC
If bmp\bmBitsPixel = 32
hDCMem.l = CreateCompatibleDC_(hDCDst)
hBmp.l = CreateBitmap_(bmp\bmWidth, bmp\bmHeight, 1, 32, 0)
SetDIBits_(hDCMem, hBmp, 0, bmp\bmHeight, @bBits(0, 0), @bmpinfo, #DIB_RGB_COLORS)
hBmpOld.l = SelectObject_(hDCMem, hBmp)
dwBlend.l
*blend.BLENDFUNCTION = @dwBlend
With *blend
\BlendOp = #AC_SRC_OVER
\BlendFlags = 0
\SourceConstantAlpha = 255
\AlphaFormat = #AC_SRC_ALPHA
EndWith
AlphaBlend(hDCDst, *rectDst\Left, *rectDst\Top, *rectDst\Right - *rectDst\Left, *rectDst\Bottom - *rectDst\Top, hDCMem, 0, 0, bmp\bmWidth, bmp\bmHeight, dwBlend)
SelectObject_(hDCMem, hBmpOld)
DeleteObject_(hBmp)
DeleteDC_(hDCMem)
Else
StretchDIBits_(hDCDst, *rectDst\left, *rectDst\top, *rectDst\right - *rectDst\left, *rectDst\bottom - *rectDst\top, 0, 0, bmp\bmWidth, bmp\bmHeight, @bBits(0, 0), @bmpinfo, #DIB_RGB_COLORS, #SRCCOPY)
EndIf
ProcedureReturn 1
EndProcedure
原因一:
产生这个问题的原因是LZ没有搞清楚灰度图像的真正含义。首先按照楼主转化灰度图像的代码来看,假设颜色BGRBGRBGRBGR,其中某个单元BGR值为100,200,100,按照楼主的算法只是简单的把这个单元改为140,140,140。意思是其实仍然是彩色图像,只是他的红绿蓝三个波段的值是相同的所以人的肉眼观察到的就是灰度图像而已。另外LZ能够读取一副真正灰度图像的灰度值,是因为彩色图像是3个字节表示一个像素颜色,即BGR,而通常我们所说的灰度图像是指256位的图像,一个字节表示一个像素,即只有Grey(0-255的灰度)。因为以上两种图片看起来效果一样,而实际并不相同,所以会产生LZ所说的问题,所以LZ在转换之后确定BMP都头文件部分是不是改了,但是看楼主的代码使用lineByte(彩色图像和灰度图像不同)了,我觉得LZ应该考虑到了这方面的问题,所以请看原因二原因二
xx[][]数组没有分配空间,xx数据占用了超过系统允许的最大值的空间,如果只是int xx[][],在以后的计算是会出现问题的,需要手动用new等语句分配空间,另外单步调试时*( pImgDataOut+i*lineByteOut+j )如果有值而xx[][]为0的话,基本可以确定是由于数组空间问题引起的了。