效果要和用画图程序新建生成的一模一样.因为我用以前用的是一个网友的程序,拷屏,结果生成的位图在画图程序中,看不出来和用画图程序生成的位图有什么区别,但在别的程序却不同,百思不得其解!有兴趣的帮助看一下这两幅位图(留下EMAIL,^_^谢谢)
背景默认是白色,给出长和宽和每位像素的位数.希望给点代码^_^
谢谢!顺祝新年快乐!

解决方案 »

  1.   

    情况是这样的:现在,我可以生成位图了,也可以通过神龙卡在电视机上显示了,但背景色仍然不是透明的!如果用画图程序新建一个位图,把背景色设为白色,然后在上面输出一些文字,通过神龙卡厂家提供的程序,就可以通过神龙卡输出到电视机上了,并且背景色是透明的.这样用户在看电影的时候我们就可以输出字幕了.但我用CSDN上朋友们告诉我的方法:先在一个DIALOG上设置背景为白色,输出一些文字,然后保存为BMP文件,但这个文件在电视机上显示的时候背景色就不是透明的.我用我的肉眼实在是看不出来这两种方法生成的位图有什么区别!所有又在这里求救了!我怀疑像素颜色那部分可以没问题,问题可能在BMP文件头,所以我想先生成一个类似于用画图程序生成的位图,然后用拷屏的方式,把我的DIALOG上的字符串转换成位图,然后把后者的像素部分考到前者的像素部分.当然两者的长和宽要相等.
    但我现在不知道怎么生成一个和用画图程序生成的位图一模一样的位图. pomelowu(羽战士)大哥,我的表达能力比较差^_^
    不知道把问题说清楚没有?你看我的想法正确吗?或者你还有什么高招吗?或者你帮我看一下两种位图?或者帮我看一下我的程序?谢谢!
      

  2.   

    看看能正确显示的位图是多少位,背景是白色RGB(255,255,255)还是和白色相近的颜色,也许肉眼分辨不出来但还是有区别的
      

  3.   

    这个我确定都是白色,RGB(255,255,255),我下载的一个工具看的.
      

  4.   

    在画图中你是保存色深是真彩色(24、32位色)的吧?如果生成的为图色深不是真彩色,那么因为数据压缩,你看到的白色背景并不一定是真正的白色背景,而有可能是近似的白色。可以用PhotoShop取背景色看看。
      

  5.   

    http://community.csdn.net/Expert/topic/3673/3673458.xml?temp=.6816675
      

  6.   

    呵呵,谢谢,不过这不是我想要的.
    我只是想新建一个和画图程序新建的位图"一模一样"的一个类或函数类似:createBMP(BMPFileName,width,height,bitCount)
    注:我以前用的程序是网上很通用的拷屏程序,它生成的位图好像和画图生成的有点不一样.如果兄弟们的程序也是这个就不要发了,谢谢!顺祝新年快乐!^_^
      

  7.   

    谢谢你啦, bobob(静思) 
    不过,我真的不是要合并两个位图啊,我是想先生成一个类似用画图程序新建的位图,然后用我的位图的颜色数据部分去替换它,现在我的问题是前者.
      

  8.   

    如果你非要这样,那就使用笨一点的办法因为我用以前用的是一个网友的程序,拷屏,结果生成的位图在画图程序中,看不出来和用画图程序生成的位图有什么区别既然看不出来,直接看bmp的原文件,应该能看出来吧?bmp又没有加密
      

  9.   

    冒个泡~~你用程序和paint分别做两个小一点的位图,设置为同样大小、同样色深。然后用程序分别读,看看在什么地方有不同。
    另外可以用windiff比较看看位图数据是不是一样的。
      

  10.   

    做了,用的是UltraEdit的比较功能.生成位图的方法如下:
    1.先用我的程序生成一个位图,256色
    2.用画图程序新建一个位图,256色
    3.把我的位图全选,复制到新位图上,并调整大小.
    4.肉眼比较:颜色,文件大小完全一样.用UltraEdit的二进制比较比较结果如下:
    4459字节差异,319字节匹配,4778字节总数
      

  11.   

    出乎意料的是:文件头倒大部分差不多,具体的位图数据部分反而大部分不同.
    现在找了点BMP文件资料慢慢分析分析.是不是很奇怪?全选,复制生成的位图的比较结果竟然会是这样?!
      

  12.   

    这样比较只是大概知道差异在哪里。
    应该用程序读BITMAPHEADERINFO和BITMAPINFO两个结构,看看有没有差异。如果为图数据差异太大,则是调色板的问题。
      

  13.   

    biXPelsPermeter
     水平方向上的每米的像素个数 
    biYpelsPerMeter
     垂直方向上的每米的像素个数 
    biClrused
     调色板中实际使用的颜色数(2) 
    biClrImportant
     现实位图时必须的颜色数(3) 
    就用UltraEdit读出来了,上面几个参数不一样.
    终于找到原因了:我的程序开始生成的是一个24位的位图,后来用一个网友给我的代码:http://www.codeguru.com/Cpp/G-M/bitmap/article.php/c4927/
    转换成了256色的位图.
    我发现用这种方法生成的位图就和用画图程序中另存为生成的位图不一样
      

  14.   

    主要是BITMAPHEADERINFO和BITMAPINFO里面的东西不一样
    我刚才看了一下CXImage 里面有关透明的代码,也是对这两个机构做了处理
      

  15.   

    void TransparentBlt( HDC hdcDest, 
                         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();
    }