游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3248|回复: 7

向BMP写入文字[em17]

[复制链接]

2

主题

6

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2006-7-8 15:27:00 | 显示全部楼层 |阅读模式
BYTE *data                        = NULL;
HBITMAP                                hbmBitmap;
HDC                                        hDC                = NULL;
HFONT                                hFont;
BITMAPINFO                        bmi = {0};
int                                        iFontSize = 512;

//if( !( hDC = CreateCompatibleDC(GetDC(0)) ) )

if( !( hDC = CreateCompatibleDC(NULL) )
{
        MessageBox( NULL, "Create a memory DC Faile", "错误", MB_OK );
        return;
}

ZeroMemory( &bmi.bmiHeader, sizeof(BITMAPINFOHEADER) );
bmi.bmiHeader.biSize                = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biPlanes                = 1;
bmi.bmiHeader.biCompression        = BI_RGB;
bmi.bmiHeader.biBitCount        = 32;
bmi.bmiHeader.biWidth                = iFontSize;
bmi.bmiHeader.biHeight                = -iFontSize;

if( !( hbmBitmap = CreateDIBSection( hDC, &bmi, DIB_RGB_COLORS, (void**)&data, NULL, 0 ) ) )
{
        MessageBox( NULL, "", "错误", MB_OK );
        return;
}

SelectObject( hDC, hbmBitmap );

if( !( hFont  =  CreateFont( iFontSize, 0, 0, 0, 400, FALSE, FALSE, 0, GB2312_CHARSET, OUT_DEFAULT_PRECIS,
                                                                CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH|FF_SWISS, "宋体" ) ) )
{
        MessageBox( NULL, "字体", "", MB_OK );
        return;
}
SetMapMode( hDC, MM_TEXT );
SetTextAlign( hDC, TA_TOP );
SetTextColor( hDC, RGB(255,255,255) );
SetBkColor        ( hDC, 0 );
SelectObject( hDC, hFont );

TextOut( hDC, 0, 0, "晕", 2 );

DeleteObject( hbmBitmap );
DeleteDC( hDC );
是有关把文字写入BMP.在网上也找了几天的资料,但是还未解决到问题。
希望知道的 网友帮帮忙

=================问题=================
TextOut后data的值为什么还是空的 [em17]

18

主题

971

帖子

982

积分

高级会员

Rank: 4

积分
982
发表于 2006-7-8 16:08:00 | 显示全部楼层

Re:向BMP写入文字[em17]

答:
因为textOut把文字输出到屏幕上去了...哈哈

2

主题

6

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2006-7-8 16:18:00 | 显示全部楼层

Re:向BMP写入文字[em17]

The CreateCompatibleDC function creates a memory device context (DC) compatible with the specified device.
HDC CreateCompatibleDC(
HDC hdc   // handle to DC
);
Parameters
hdc
[in] Handle to an existing DC. If this handle is NULL, the function creates a memory DC compatible with the application's current screen

CreateCompatibleDC的参数已经是空了,不会输出到输出到屏幕上去吧?????????

2

主题

6

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2006-7-10 13:46:00 | 显示全部楼层

Re:向BMP写入文字

也用了
CreateDIBSection

5

主题

14

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2006-7-10 14:24:00 | 显示全部楼层

Re:向BMP写入文字[em17]

好像只是在内存中创建了一个用于存储位图的空间句柄,之后将其先入设备装置中,又创建了一个字体句柄,也同样将其选入设备装置中,之后就用Textout函数输出,但是我要说的是你的那个函数正如上家说的只是在显示在屏幕上而已,而并没有把你选入设备装置中的位图句柄和字体句柄通过函数写入绘图页面中,也就是位图句柄在此没有利用,可以通过blt复制函数完成,这是我的一点见解,不知对否

6

主题

99

帖子

99

积分

注册会员

Rank: 2

积分
99
发表于 2006-8-24 15:13:00 | 显示全部楼层

Re: 向BMP写入文字[em17]

// 看看以下代码,应该有帮助
        HDC mdc = CreateCompatibleDC(GetDC(0));
        HBITMAP hLoadBmp =(HBITMAP)LoadImage(NULL,"test.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

        SelectObject(mdc,hLoadBmp);
        char tmp[] = "OK!!It is good!";
        SetBkMode(mdc,TRANSPARENT);
        TextOut(mdc,0,0,tmp,sizeof(tmp));
        SaveBitmapToFile(hLoadBmp,"save.bmp");
        DeleteDC(mdc);
        DeleteObject(hLoadBmp);

// 下面的函数是从一个制作印章程序中拷贝得到的,原来要这样才能正确保存文件,我自写的就是工作错误:花花绿绿的!
// 当bmp被选入compatible DC后该DC才能正常工作,实际的操作范围就是图片,图片数据也在操作时发生了相应的改变,
// 这就是我所想的原理,不正确之处请指出.
// 第一次发表看法,感觉不错。


BOOL SaveBitmapToFile(HBITMAP hBitmap, LPSTR lpFileName)   //hBitmap   为刚才的屏幕位图句柄   lpFileName   为位图文件名  
{            
        //设备描述表  
        HDC  hDC;  
    //当前分辨率下每象素所占字节数  
    int  iBits;  
    //位图中每象素所占字节数  
    WORD  wBitCount;  
    //定义调色板大小,  位图中像素字节大小  ,位图文件大小  ,  写入文件字节数   
    DWORD  dwPaletteSize=0,  dwBmBitsSize=0,  dwDIBSize=0,  dwWritten=0;   
    //位图属性结构   
    BITMAP  Bitmap;      
    //位图文件头结构  
    BITMAPFILEHEADER  bmfHdr;      
    //位图信息头结构   
    BITMAPINFOHEADER  bi;      
    //指向位图信息头结构      
    LPBITMAPINFOHEADER  lpbi;      
    //定义文件,分配内存句柄,调色板句柄   
    HANDLE  fh,  hDib,  hPal,hOldPal=NULL;   
            
    //计算位图文件每个像素所占字节数   
    hDC  =  CreateDC("DISPLAY",  NULL,  NULL,  NULL);  
    iBits  =  GetDeviceCaps(hDC,  BITSPIXEL)  *  GetDeviceCaps(hDC,  PLANES);   
    DeleteDC(hDC);   
    if  (iBits <= 1)                     
                wBitCount = 1;   
    else  if  (iBits <= 4)            
                wBitCount  =  4;   
    else  if  (iBits <= 8)      
                wBitCount = 8;   
    else  
                wBitCount = 24;   
            
    GetObject(hBitmap,  sizeof(Bitmap),  (LPSTR)&Bitmap);  
    bi.biSize = sizeof(BITMAPINFOHEADER);  
    bi.biWidth = Bitmap.bmWidth;  
    bi.biHeight = Bitmap.bmHeight;  
    bi.biPlanes = 1;  
    bi.biBitCount = wBitCount;  
    bi.biCompression = BI_RGB;  
    bi.biSizeImage = 0;  
    bi.biXPelsPerMeter = 0;  
    bi.biYPelsPerMeter = 0;  
    bi.biClrImportant = 0;  
    bi.biClrUsed = 0;  
            
    dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;  
            
    //为位图内容分配内存   
    hDib = GlobalAlloc(GHND,dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER));   
    lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);   
    *lpbi = bi;   

    //  处理调色板      
    hPal = GetStockObject(DEFAULT_PALETTE);   
    if(hPal)   
    {   
                hDC = ::GetDC(NULL);   
        hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);   
        RealizePalette(hDC);   
      }  

    //  获取该调色板下新的像素值   
    GetDIBits(hDC, hBitmap, 0, (UINT)Bitmap.bmHeight,
                                (LPSTR)lpbi + sizeof(BITMAPINFOHEADER)   
                 + dwPaletteSize, (BITMAPINFO*)lpbi,  DIB_RGB_COLORS);   
            
    //恢复调色板      
    if  (hOldPal)   
    {   
                ::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);   
        RealizePalette(hDC);   
        ::ReleaseDC(NULL, hDC);   
       }   

    //创建位图文件      
    fh = CreateFile(lpFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,   
                      FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);   
            
    if(fh == INVALID_HANDLE_VALUE)   
                return  FALSE;   
            
    //  设置位图文件头   
    bmfHdr.bfType = 0x4D42;  //  "BM"   
    dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
                                + dwPaletteSize + dwBmBitsSize;      
    bmfHdr.bfSize = dwDIBSize;   
    bmfHdr.bfReserved1 = 0;   
    bmfHdr.bfReserved2 = 0;   
    bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER)
                                                + dwPaletteSize;   
    //  写入位图文件头   
    WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);   
    //  写入位图文件其余内容   
    WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);   
    //清除      
    GlobalUnlock(hDib);   
    GlobalFree(hDib);   
    CloseHandle(fh);   

    return TRUE;         
}  [em3]

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2006-8-24 16:08:00 | 显示全部楼层

Re:向BMP写入文字[em17]

GetGlyphOutline 取出data来直接blt到dc上

29

主题

81

帖子

85

积分

注册会员

Rank: 2

积分
85
发表于 2006-8-24 17:33:00 | 显示全部楼层

Re:向BMP写入文字[em17]

可以看一下云风的wpp16里头有关于将文字绘制到自定义的数据区的代码,
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-25 04:54

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表