游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3176|回复: 6

请教,16位位图读取出来无法去除背景如何去除,有代码请

[复制链接]

11

主题

16

帖子

22

积分

注册会员

Rank: 2

积分
22
发表于 2010-4-24 17:46:00 | 显示全部楼层 |阅读模式
HANDLE hFile;
        hFile = CreateFile(file,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
        DWORD dwReads;

        BITMAPINFO info;
        BITMAPFILEHEADER bmfh;
        ReadFile(hFile,&bmfh,sizeof(BITMAPFILEHEADER),&dwReads,NULL);
        if(bmfh.bfType != 0x4d42)
        {
                MessageBox(0,"不是位图文件","",0);
                return false;
        }
        ReadFile(hFile,&info.bmiHeader,sizeof(BITMAPINFOHEADER),&dwReads,NULL);
        if(info.bmiHeader.biBitCount != 16)
        {
                MessageBox(0,"!=16","",0);
                return false;
        }
        int m=2;
        int size = info.bmiHeader.biWidth*info.bmiHeader.biHeight*m;                     //位图大小
        char *pbuf =new char[size];                                  //位图信息
        SetFilePointer(hFile,0,NULL,bmfh.bfOffBits);                 //将文件指针指向当前位图信息位置   
        ReadFile(hFile,pbuf,size,&dwReads,NULL);                     //读取位图信息到pbuf;   
    CloseHandle(hFile);
        char *pch;
       
    info.bmiColors[0].rgbRed   = (BYTE)0xF800;               //红色掩码
        info.bmiColors[0].rgbBlue  = (BYTE)0x001F;               //蓝色掩码
        info.bmiColors[0].rgbGreen = (BYTE)0x07E0;               //绿色掩码
        info.bmiColors[0].rgbReserved = 0;
        if(m_D3D9Device->CreateTexture(info.bmiHeader.biWidth,info.bmiHeader.biHeight,1,0,D3DFMT_R5G6B5,D3DPOOL_MANAGED,&m_D3D9Texture,0)==D3D_OK)
        {
                D3DLOCKED_RECT stLockedRect;

                m_D3D9Texture->LockRect(0,&stLockedRect,0,0);
                pch = (char*) stLockedRect.pBits;

                for( int i=info.bmiHeader.biHeight-1;i>=0;i--)
                {
                        for(int j=0;j<info.bmiHeader.biWidth;j++)
                        {
                                pch[0]=pbuf[i*info.bmiHeader.biWidth*m+j*m];   //& 0xf800;// 1 & 0xf800;      // & 0xf800
                                pch[1]=pbuf[i*info.bmiHeader.biWidth*m+j*m+1] ;// & 0x07e0;      // & 0x07e0
                                pch[2]=pbuf[i*info.bmiHeader.biWidth*m+j*m+2]; // & 0x001f; //& 0x001f;      //& 0x001f
                                pch+=2;
                        }
                }

                m_D3D9Texture->UnlockRect(0);


                delete pbuf;
        }

HRESULT result=D3DXCreateSprite(m_D3D9Device,&(m_D3D9Sprite));  //创建精灵对象
使用 m_D3D9Sprite 进行绘制的...

0

主题

398

帖子

577

积分

高级会员

Rank: 4

积分
577
发表于 2010-4-26 10:58:00 | 显示全部楼层

Re:请教,16位位图读取出来无法去除背景如何去除,有代码请

牛人,图片载入都自己写!! [em16]

1

主题

266

帖子

280

积分

中级会员

Rank: 3Rank: 3

积分
280
发表于 2010-4-27 01:41:00 | 显示全部楼层

Re:请教,16位位图读取出来无法去除背景如何去除,有代码请

回楼上:图片载入不自己写? 谁帮你实现啊?

回楼主:你的函数我没细看,感觉大致上是正确的,应该能正常取得bmp的图像内容。
去除背景是指将背景色的地方变透明。
但是 你创建的D3DTexture是16位的,也就是说不包含alpha值,那怎么去除背景啊?
你应该创建带alpha的32位texture,并根据背景颜色将相关的像素位的alpha值设为0。 来实现背景透明

0

主题

398

帖子

577

积分

高级会员

Rank: 4

积分
577
发表于 2010-4-27 18:17:00 | 显示全部楼层

Re: Re:请教,16位位图读取出来无法去除背景如何去除,有代

onemoo: Re:请教,16位位图读取出来无法去除背景如何去除,有代码请看看

回楼上:图片载入不自己写? 谁帮你实现啊?

回楼主:你的函数我没细看,感觉大致上是正确的,应该能正常...

微软帮我实现....

1

主题

266

帖子

280

积分

中级会员

Rank: 3Rank: 3

积分
280
发表于 2010-4-28 00:37:00 | 显示全部楼层

Re: Re: Re:请教,16位位图读取出来无法去除背景如何去除,有

artint: Re: Re:请教,16位位图读取出来无法去除背景如何去除,有代码请看看


微软帮我实现....


哈哈  是啊
只不过我不太喜欢过于依赖系统平台API。

11

主题

1238

帖子

1782

积分

金牌会员

Rank: 6Rank: 6

积分
1782
发表于 2010-4-28 09:09:00 | 显示全部楼层

Re:请教,16位位图读取出来无法去除背景如何去除,有代码请

都次世代了还玩这个呀.......

1

主题

266

帖子

280

积分

中级会员

Rank: 3Rank: 3

积分
280
发表于 2010-4-28 10:47:00 | 显示全部楼层

Re: Re:请教,16位位图读取出来无法去除背景如何去除,有代

游戏阿家: Re:请教,16位位图读取出来无法去除背景如何去除,有代码请看看

都次世代了还玩这个呀.......

不过  这个是基础啦
自然要学习的
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-16 21:21

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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