效果要和用画图程序新建生成的一模一样.因为我用以前用的是一个网友的程序,拷屏,结果生成的位图在画图程序中,看不出来和用画图程序生成的位图有什么区别,但在别的程序却不同,百思不得其解!有兴趣的帮助看一下这两幅位图(留下EMAIL,^_^谢谢)
背景默认是白色,给出长和宽和每位像素的位数.希望给点代码^_^
谢谢!顺祝新年快乐!
背景默认是白色,给出长和宽和每位像素的位数.希望给点代码^_^
谢谢!顺祝新年快乐!
解决方案 »
- 请教下string使用
- CImageList加载大位图里一系列小图标的问题
- 请问怎样改变页面元素中的 style 属性????
- 询问:如何用vc自动实现数据库衔接
- 使用CHtmlView这个显示网页时,为什么占用那么大的内存啊。
- 如何通过程序的方式生成一个Unicode格式编码的文本文件txt,而不是普通的ANSI格式编码?
- 默认窗口处理函数DefWindowProc
- 高分求用mpeg4的divx算法压缩bmp数据的原代码
- 在vb环境下和直接运行编译好的应用程序的结果怎么会不一样的?
- MFC执行后窗口不出现
- 联竣信息科技(上海)有限公司诚聘英才
- 简单问题:vector<string> and vector3f分别表示什么意思?
但我现在不知道怎么生成一个和用画图程序生成的位图一模一样的位图. pomelowu(羽战士)大哥,我的表达能力比较差^_^
不知道把问题说清楚没有?你看我的想法正确吗?或者你还有什么高招吗?或者你帮我看一下两种位图?或者帮我看一下我的程序?谢谢!
我只是想新建一个和画图程序新建的位图"一模一样"的一个类或函数类似:createBMP(BMPFileName,width,height,bitCount)
注:我以前用的程序是网上很通用的拷屏程序,它生成的位图好像和画图生成的有点不一样.如果兄弟们的程序也是这个就不要发了,谢谢!顺祝新年快乐!^_^
不过,我真的不是要合并两个位图啊,我是想先生成一个类似用画图程序新建的位图,然后用我的位图的颜色数据部分去替换它,现在我的问题是前者.
另外可以用windiff比较看看位图数据是不是一样的。
1.先用我的程序生成一个位图,256色
2.用画图程序新建一个位图,256色
3.把我的位图全选,复制到新位图上,并调整大小.
4.肉眼比较:颜色,文件大小完全一样.用UltraEdit的二进制比较比较结果如下:
4459字节差异,319字节匹配,4778字节总数
现在找了点BMP文件资料慢慢分析分析.是不是很奇怪?全选,复制生成的位图的比较结果竟然会是这样?!
应该用程序读BITMAPHEADERINFO和BITMAPINFO两个结构,看看有没有差异。如果为图数据差异太大,则是调色板的问题。
水平方向上的每米的像素个数
biYpelsPerMeter
垂直方向上的每米的像素个数
biClrused
调色板中实际使用的颜色数(2)
biClrImportant
现实位图时必须的颜色数(3)
就用UltraEdit读出来了,上面几个参数不一样.
终于找到原因了:我的程序开始生成的是一个24位的位图,后来用一个网友给我的代码:http://www.codeguru.com/Cpp/G-M/bitmap/article.php/c4927/
转换成了256色的位图.
我发现用这种方法生成的位图就和用画图程序中另存为生成的位图不一样
我刚才看了一下CXImage 里面有关透明的代码,也是对这两个机构做了处理
int nXDest,
int nYDest,
int nWidth,
int nHeight, HBITMAP hBitmap, int nXSrc, int nYSrc,
COLORREF colorTransparent, HPALETTE hPal )
{
CDC dc, memDC, maskDC, tempDC;
dc.Attach( hdcDest );
maskDC.CreateCompatibleDC(&dc);
CBitmap maskBitmap;
//add these to store return of SelectObject() calls
CBitmap* pOldMemBmp = NULL;
CBitmap* pOldMaskBmp = NULL;
HBITMAP hOldTempBmp = NULL;
memDC.CreateCompatibleDC(&dc);
tempDC.CreateCompatibleDC(&dc);
CBitmap bmpImage;
bmpImage.CreateCompatibleBitmap( &dc, nWidth, nHeight );
pOldMemBmp = memDC.SelectObject( &bmpImage );
// Select and realize the palette
if( dc.GetDeviceCaps(RASTERCAPS) & RC_PALETTE && hPal )
{
::SelectPalette( dc, hPal, FALSE );
dc.RealizePalette();
::SelectPalette( memDC, hPal, FALSE );
}
hOldTempBmp = (HBITMAP) ::SelectObject( tempDC.m_hDC, hBitmap );
memDC.BitBlt( 0,0,nWidth, nHeight, &tempDC, nXSrc, nYSrc, SRCCOPY );
// Create monochrome bitmap for the mask
maskBitmap.CreateBitmap( nWidth, nHeight, 1, 1, NULL );
pOldMaskBmp = maskDC.SelectObject( &maskBitmap );
memDC.SetBkColor( colorTransparent );
// Create the mask from the memory DC
maskDC.BitBlt( 0, 0, nWidth, nHeight, &memDC,
0, 0, SRCCOPY );
// Set the background in memDC to black. Using SRCPAINT with black
// and any other color results in the other color, thus making
// black the transparent color
memDC.SetBkColor(RGB(0,0,0));
memDC.SetTextColor(RGB(255,255,255));
memDC.BitBlt(0, 0, nWidth, nHeight, &maskDC, 0, 0, SRCAND);
// Set the foreground to black. See comment above.
dc.SetBkColor(RGB(255,255,255));
dc.SetTextColor(RGB(0,0,0));
dc.BitBlt(nXDest, nYDest, nWidth, nHeight, &maskDC, 0, 0, SRCAND);
// Combine the foreground with the background
dc.BitBlt(nXDest, nYDest, nWidth, nHeight, &memDC,
0, 0, SRCPAINT);
if (hOldTempBmp)
::SelectObject( tempDC.m_hDC, hOldTempBmp);
if (pOldMaskBmp)
maskDC.SelectObject( pOldMaskBmp );
if (pOldMemBmp)
memDC.SelectObject( pOldMemBmp );
dc.Detach();
}