游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2978|回复: 8

颜色转换(昨天已经郁闷一天了,急...)

[复制链接]

7

主题

36

帖子

40

积分

注册会员

Rank: 2

积分
40
QQ
发表于 2004-4-30 10:10:00 | 显示全部楼层 |阅读模式
8和24位转16的555都可以  就是转是565不行,为甚么呀 不就是绿色多了一位嘛 怎么写都不行

_inline WORD 8_to_16(const RGBQUAD * pal,DWORD index)
{
    return (pal[index].rgbBlue)>>3 | ((pal[index].rgbGreen>>3)<<5) | ((pal[index].rgbRed>>3)<<10);
}

_inline WORD 24_to_16(BYTE r,BYTE g,BYTE b)
{
    return ((WORD)(r>>3)<<10) | ((WORD)(g>>3)<<5) | ((WORD)b>>3);
}
转成565我觉得应该是下面这样呀,哪位帮帮忙呀,郁闷中....
(pal[index].rgbBlue)>>3 | ((pal[index].rgbGreen>>2)<<5) | ((pal[index].rgbRed>>3)<<11);
HRESULT CImage:rawImage(LPDIRECTDRAW7 lpdd,int nOriX,int nOriY,int nWidth,int nHeight,DWORD dwFlags)
{
        HRESULT hr;

        if(NULL == lpdd)
                return E_POINTER;

        Convert16();

        memset(&m_ddsd,0,sizeof(m_ddsd));
        m_ddsd.dwSize = sizeof(m_ddsd);
        m_ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
        m_ddsd.dwWidth = nWidth;
        m_ddsd.dwHeight = nHeight;
        m_ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | dwFlags;

        if(FAILED(lpdd->CreateSurface(&m_ddsd,&m_pSurf,NULL)))
                return E_FAIL;
       
        BITMAPINFOHEADER bih;
        memset(&bih,0,sizeof(bih));
        bih.biSize = sizeof(bih);
        bih.biPlanes = 1;
        bih.biWidth = nWidth;
        bih.biHeight = nHeight;
        bih.biBitCount = m_nBitCount;
        HDC hdc;
        if(FAILED(hr = m_pSurf->GetDC(&hdc)))
                return hr;
        HDRAWDIB hdib = DrawDibOpen();
        if(!(DrawDibDraw(hdib,hdc,0,0,nWidth,nHeight,&bih,(LPVOID)m_pImage,nOriX,nOriY,nWidth,nHeight,0)))
                return E_FAIL;
        DrawDibClose(hdib);
        if(FAILED(hr = m_pSurf->ReleaseDC(hdc)))
                return hr;

        return S_OK;
}
inline WORD CImage::_8_to_16(const RGBQUAD * pal,DWORD index)
{
        return (pal[index].rgbBlue)>>3 | ((pal[index].rgbGreen>>3)<<5) | ((pal[index].rgbRed>>3)<<10);  //555
        return (pal[index].rgbBlue)>>3 | ((pal[index].rgbGreen>>2)<<5) | ((pal[index].rgbRed>>3)<<11);  //565
}
inline WORD CImage::_24_to_16(BYTE r,BYTE g,BYTE b)
{       
return ((WORD)(r>>3)<<10) | ((WORD)(g>>3)<<5) | ((WORD)b>>3);//555
return ((WORD)(r>>3)<<11) | ((WORD)(g>>2)<<5) | ((WORD)b>>3);//565
}

[em7]

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20527
发表于 2004-4-30 11:06:00 | 显示全部楼层

Re:颜色转换(昨天已经郁闷一天了,急...)

看了一下,感觉好像挺正常的,能不能说说错误的现象?

7

主题

36

帖子

40

积分

注册会员

Rank: 2

积分
40
QQ
 楼主| 发表于 2004-4-30 11:16:00 | 显示全部楼层

Re:颜色转换(昨天已经郁闷一天了,急...)

我给你贴2张图片,回复怎么贴图片呀?
那我新开一个标题为 颜色转换后的图片  帖子

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20527
发表于 2004-4-30 11:33:00 | 显示全部楼层

Re:颜色转换(昨天已经郁闷一天了,急...)

还是看不出错误,哎。。。。

测试一下
你随便添入一个pixel=11111 000000 00000   // 红色
       pixel=00000 111111 00000  // 绿色
       pixel=00000 000000 11111  // 蓝色

先看看你的表面是否正确。

7

主题

36

帖子

40

积分

注册会员

Rank: 2

积分
40
QQ
 楼主| 发表于 2004-4-30 11:49:00 | 显示全部楼层

Re:颜色转换(昨天已经郁闷一天了,急...)

这样是没有错的,我再举个例子:  我转换一张8位的图片,转换成565后,就是你看到的那种颜色丢失,但是我再把转换后丢失了颜色的数据再保存成一张555的16位图片(在程序中先转,再保存)的时候,再windows下查看居然是正常的,那么我再载入这张555的图片,不进行转换,显示的时候也是颜色丢失,而我保存成565的时候,就不正常了,也是一样颜色丢失.真的不知道是为什么,我的显卡是ati9600的,拔掉显卡用内置显卡GF4也是一样的
郁闷.......

7

主题

36

帖子

40

积分

注册会员

Rank: 2

积分
40
QQ
 楼主| 发表于 2004-4-30 12:55:00 | 显示全部楼层

Re:颜色转换(昨天已经郁闷一天了,急...)

DDPIXELFORMAT ddpf;
        ddpf.dwSize = sizeof(DDPIXELFORMAT);
        if( dd->GetPrimary()->GetPixelFormat(&ddpf) != DD_OK )
        {
                MessageBox(NULL,"Function: GetPixelFormat()","失败 !",MB_OK);
        }
        if(ddpf.dwGBitMask == 0x03E0)
        {
                MessageBox(NULL,"555","失败 !",MB_OK);
        }
        else if(ddpf.dwGBitMask == 0x07E0)
        {
                MessageBox(NULL,"565","失败 !",MB_OK);
        }
        else
        {
                MessageBox(NULL,"Function failed","失败 !",MB_OK);
        }
结果是565,还有可能是哪里出了问题呢?

7

主题

36

帖子

40

积分

注册会员

Rank: 2

积分
40
QQ
 楼主| 发表于 2004-4-30 13:10:00 | 显示全部楼层

Re:颜色转换(昨天已经郁闷一天了,急...)

这个DrawDibDraw也区分565和555的吗  这个函数我不熟呀,  有可能是这个函数的问题吗

30

主题

298

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
QQ
发表于 2004-4-30 14:09:00 | 显示全部楼层

Re:颜色转换(昨天已经郁闷一天了,急...)

我想既然555格式显示成功了,应该说明你的显示是555模式的,如果直接显示565格式当然就不正确了,你仍然要把565转成555才能正确显示的。我猜想应该就是这个原因。

7

主题

36

帖子

40

积分

注册会员

Rank: 2

积分
40
QQ
 楼主| 发表于 2004-4-30 14:55:00 | 显示全部楼层

Re:颜色转换(昨天已经郁闷一天了,急...)

非常谢谢站长和各位的帮忙,这个问题已经解决了,是DrawDibDraw这个函数有问题,我已经用另外的方法解决了,效率更高.^_^
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-30 16:24

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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