回 帖 发 新 帖 刷新版面

主题:请问在显示位图时,如何去掉没用的背景

请问在显示位图时,如何去掉没用的背景!

回复列表 (共5个回复)

沙发

我是用的VC++,要去掉位图中无用的背景要用到制作镂空图的技巧.VB的环境我不大清楚.

板凳

如果你是逐点的向显示器输出位图的像素,那么在遇到背景颜色的时候你可以不描绘的!
但是你要是用相关的函数的话,那么你可以找相关的函数介绍,应该有的!

3 楼

用colorkey!
每个DDraw页面允许有一种透明色用RGB表示的
当进行页面间的复制时可以跳过透明色
当然复制的函数可以自己写 这样也可以实现透明的

4 楼

一个简单的方法是使用
TransparentImage(g_mainDC,x,y,32,32,g_mainMemDC,0,0,32,32,RGB(255,255,255))
最后一个参数就是你的背景色,这里的背景色是白色.这样load到屏幕上就没有背景了!

5 楼

#ifndef __Bitmap_h
#define __Bitmap_h
#include "windows.h"
class Bitmap
{
protected:
    HBITMAP m_bitmap;
    UINT m_iWidth,m_iHeight;
public:
    Bitmap(LPTSTR name);
    Bitmap(HINSTANCE hInstance,UINT uiResID);
    Bitmap(HDC hdc,UINT width,UINT height,COLORREF color=RGB(0,0,0));

    void Draw(HDC hdc,int x,int y,bool flag=0,COLORREF color=RGB(0,0,0));
    void Draw(HDC hdc,int x,int y,int left,int top,int width,int height,bool flag=0,COLORREF color=RGB(0,0,0));

    UINT GetWidth();
    UINT GetHeight();
};
#endif
#include "Bitmap.h"

Bitmap::Bitmap(LPTSTR name)
{
  /////读取位图文件SAMPLE.BMP
    BITMAP bmp;
    m_bitmap=(HBITMAP)LoadImage(NULL,name,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
    
    GetObject(m_bitmap, sizeof(BITMAP), &bmp);

    m_iWidth = bmp.bmWidth;
    m_iHeight = bmp.bmHeight;
}
Bitmap::Bitmap(HINSTANCE hInstance,UINT uiResID)
{
    BITMAP bmp;
    m_bitmap=(HBITMAP)LoadImage(hInstance, MAKEINTRESOURCE(uiResID), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
    GetObject(m_bitmap, sizeof(BITMAP), &bmp);

    m_iWidth = bmp.bmWidth;
    m_iHeight = bmp.bmHeight;
}
Bitmap::Bitmap(HDC hdc,UINT width,UINT height,COLORREF color)
{
    HDC mhdc;
    m_bitmap=(HBITMAP)CreateCompatibleBitmap(hdc,width,height);
    mhdc=CreateCompatibleDC(hdc);
    HBITMAP oldmap=(HBITMAP)SelectObject(mhdc,m_bitmap);
    HBRUSH oldbrush=(HBRUSH)SelectObject(mhdc,(HBRUSH)CreateSolidBrush(color));
    Rectangle(mhdc,0,0,width,height);
    SelectObject(mhdc,oldbrush);
    DeleteObject(oldbrush);

    m_iWidth = width;
    m_iHeight = height;
}

void Bitmap::Draw(HDC hdc,int x,int y,bool flag,COLORREF color)
{
    HDC mhdc;
    mhdc=CreateCompatibleDC(hdc);
    HBITMAP oldmap=(HBITMAP)SelectObject(mhdc,m_bitmap);
    if(flag)
    {
        TransparentBlt(hdc,x,y,GetWidth(),GetHeight(),mhdc,0,0,GetWidth(),GetHeight(),color);
    }
    else
    {
        BitBlt(hdc,x,y,GetWidth(),GetHeight(),mhdc,0,0,SRCCOPY);
    }
    SelectObject(mhdc,oldmap);
    DeleteDC(mhdc);
}
void Bitmap::Draw(HDC hdc,int x,int y,int left,int top,int width,int height,bool flag,COLORREF color)
{
    HDC mhdc;
    mhdc=CreateCompatibleDC(hdc);
    void* oldmap=SelectObject(mhdc,m_bitmap);
    if(flag)
    {
        TransparentBlt(hdc,x,y,width,height,mhdc,left,top,width,height,color);
    }
    else
    {
        StretchBlt(hdc,x,y,width,height,mhdc,left,top,width,height,SRCCOPY);
    }
    SelectObject(mhdc,oldmap);
    DeleteDC(mhdc);
}
UINT Bitmap::GetWidth()
{
    return m_iWidth;
}
UINT Bitmap::GetHeight()
{
    return m_iHeight;
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册