16位颜色模式下bmp的显示

smiles 2002-08-08 03:01:32


要在wince的pda上显示bmp图片,已经在模拟环境里成功的显示了
各种图片,1bpp,2bpp,4bpp,8bpp,16bpp,24bpp,32bpp。现在移植
到pda的16位颜色模式下却不能显示其中的大部分图片。我考虑到
模拟环境是在pc机上的,支持24位颜色模式,而pda只有16位颜色
模式,而且不支持调色板。那位大虾能够帮忙看一下我的代码,
移植以后在16位颜色模式下应该做那些改动?我实在是找不出来
原因所在了!不胜感激


程序使用了createdibsection函数来生成hbitmap句柄,没有使用任何
调色板,在vc,embeded vc下运行正常

读文件代码如下:
struct DIBINFO : public BITMAPINFO
{
RGBQUAD arColors[255]; // Color table info - adds an extra 255 entri
to palette
operator LPBITMAPINFO() { return (LPBITMAPINFO) this; }
operator LPBITMAPINFOHEADER() { return &bmiHeader; }
RGBQUAD* ColorTable() { return bmiColors; }
};
CFile file;
if (!file.Open(lpszFileName, CFile::modeRead))
return false;
DWORD dwFileStart = file.GetPosition();
BITMAPFILEHEADER BmpFileHdr;
int nBytes;
nBytes = file.Read(&BmpFileHdr, sizeof(BmpFileHdr));
if (nBytes != sizeof(BmpFileHdr))
{
TRACE0("Failed to read file header\n");
return false;
}
// Check that we have the magic 'BM' at the start.
if (BmpFileHdr.bfType != ((WORD) ('M' << 8) | 'B'))
{
TRACE0("Not a bitmap file\n");
return false;
}
nBytes = file.Read(&bmInfo, sizeof(BITMAPINFOHEADER));
if (nBytes != sizeof(BITMAPINFOHEADER))
{
TRACE0("Failed to read BITMAPINFOHEADER\n");
return FALSE;
}
// Check that we have a real Windows DIB file.
if (bmInfo.bmiHeader.biSize != sizeof(BITMAPINFOHEADER))
{
TRACE0(" File is not a Windows DIB\n");
return FALSE;
}
int nColorSize = NumColorEntries(bmInfo.bmiHeader.biBitCount);
if (nColorSize > 0 )
{
// Read the color table from the file.
int nColorTableSize = nColorSize * sizeof(RGBQUAD);
nBytes = file.Read(bmInfo.ColorTable(), nColorTableSize);
if (nBytes != nColorTableSize)
{
TRACE0("Failed to read color table\n");
return FALSE;
}
}
int nBitsSize = BmpFileHdr.bfSize - BmpFileHdr.bfOffBits;
// Allocate the memory for the bits and read the bits from the file.
BYTE* pBits = (BYTE*) malloc(nBitsSize);
if (!pBits)
{
TRACE0("Out of memory for DIB bits\n");
return FALSE;
}
// Seek to the bits in the file.
file.Seek(dwFileStart + BmpFileHdr.bfOffBits, CFile::begin);
// read the bits
nBytes = file.Read(pBits, nBitsSize);
if (nBytes != nBitsSize)
{
TRACE0("Failed to read bits\n");
free(pBits);
return FALSE;
}
// Everything went OK.
bmInfo.bmiHeader.biSizeImage = nBitsSize;
if (!&bmInfo || !pBits)
return false;
HDC hDC = NULL;
hDC = ::GetDC(NULL);
if (!hDC)
{
TRACE0("Unable to get DC\n");
AfxThrowResourceException();
}
VOID *m_ppvBits;
m_hBitmap = CreateDIBSection(hDC, (const BITMAPINFO *)&bmInfo,
DIB_RGB_COLORS, &m_ppvBits, NULL, 0);
::ReleaseDC(NULL, hDC);
if (!m_hBitmap)
{
TRACE0("CreateDIBSection failed\n");
AfxThrowResourceException();
}
DWORD dwImageSize = bmInfo.bmiHeader.biSizeImage;
memcpy(m_ppvBits, pBits, dwImageSize);



显示的代码如下
CShowBmpTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (pDoc->m_hBitmap)
{
CDC pMemDC;
pMemDC.CreateCompatibleDC(pDC);
if (!pMemDC.GetSafeHdc())
return ;
HBITMAP m_hOldBitmap;
m_hOldBitmap = (HBITMAP) ::SelectObject(pMemDC.GetSafeHdc(), pDoc->m_hBi
p);
if (!m_hOldBitmap)
{
pMemDC.DeleteDC();
return ;
}
BOOL bResult = pDC->StretchBlt(pDoc->m_destRect.left,
pDoc->m_destRect.top,
pDoc->bmInfo.bmiHeader.biWidth,
pDoc->bmInfo.bmiHeader.biHeight,
&pMemDC,
pDoc->m_srcRect.left ,
p);
if (!m_hOldBitmap)
{
pMemDC.DeleteDC();
return ;
}
BOOL bResult = pDC->StretchBlt(pDoc->m_destRect.left,
pDoc->m_destRect.top,
pDoc->bmInfo.bmiHeader.biWidth,
pDoc->bmInfo.bmiHeader.biHeight,
&pMemDC,
pDoc->m_srcRect.left ,
pDoc->m_srcRect.top ,
pDoc->bmInfo.bmiHeader.biWidth ,
pDoc->bmInfo.bmiHeader.biHeight,
SRCCOPY);
pMemDC.DeleteDC();
pDC->SelectObject(m_hOldBitmap);

--


...全文
111 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
smiles 2002-08-08
  • 打赏
  • 举报
回复
很不幸,embeded vc不支持stretchDIBits函数
dimcat 2002-08-08
  • 打赏
  • 举报
回复
可以使用CreateDIBSection和StretchDIBits

这段对你不知有用没?


CPaintDC pDC(this); // device context for painting

//HDC hdc; // handle of the DC we will create
//HBITMAP hbitmap; // bitmap handle
BITMAPINFO bmi; // bitmap header
//VOID *pvBits; // pointer to DIB section

//hdc = CreateCompatibleDC(pDC.GetSafeHdc());

// zero the memory for the bitmap info
ZeroMemory(&bmi, sizeof(BITMAPINFO));

// setup bitmap info
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = m_iWndX;
bmi.bmiHeader.biHeight = m_iWndY;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 24; // three 8-bit components
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biSizeImage = m_iWndX * m_iWndY * 3;// 图片缓冲区大小

// create our DIB section and select the bitmap into the dc
//hbitmap = CreateDIBSection(hdc, &bmi, DIB_RGB_COLORS, &pvBits, NULL, 0x0);
//SelectObject(hdc, hbitmap);


// Draw picture
StretchDIBits(pDC.GetSafeHdc(), 0, 0, m_iWndX, m_iWndY, 0, 0, m_iWndX, m_iWndY, m_byData, &bmi, DIB_RGB_COLORS, SRCCOPY);
一级计算机基础及Photoshop应用选择题(1)全文共9页,当前为第1页。一级计算机基础及Photoshop应用选择题(1)全文共9页,当前为第1页。一级计算机基础及Photoshop应用选择题(1)全文共9页,当前为第1页。一级计算机基础及Photoshop应用选择题(1)全文共9页,当前为第1页。一级计算机基础及Photoshop应用选择题 一级计算机基础及Photoshop应用选择题(1)全文共9页,当前为第1页。 一级计算机基础及Photoshop应用选择题(1)全文共9页,当前为第1页。 一级计算机基础及Photoshop应用选择题(1)全文共9页,当前为第1页。 一级计算机基础及Photoshop应用选择题(1)全文共9页,当前为第1页。 构成Photohop图像最基本的单元是像素 【解析】像素是构成Photohop图像最基本的单元。当把图像放大到一定程度,图像显示为一 个个像素块。 关于矢量图形与图图像的描述中,正确的是矢量图形放大后不产生锯齿,图图像放大后会产生锯齿。 【解析】矢量图是用一系列计算指令来表示的图,因此矢量图是用数学方法描述的图,本质上是 很多个数学表达式的编程语言表达,因此放大时不会产生锯齿。图图像由像素组成,每个像素都被分配一个特定置和颜色值。图图像与分辨率有关,即在一定面积的图像上包含有固定数量的像素。因此,如果在屏幕上以较大的倍数放大显示图像,或以过低的分辨率打印,图图像会出现锯齿边缘。 减色系统的三原色是青、品、黄 在Photohop中,能直接转换成"图"模式的是灰度模式的图像。 【解析】模式模式之间转换,一定会丢失颜色,先转换成灰度模式可以尽量减少丢失的颜色。 所以,模式之间转换,一般先转换为灰度模式,再转换成其他模式,灰度模式可以直接转换成模式。 关于色彩模式,错误的描述是RGB模式的图像可以直接转换为模式 一级计算机基础及Photoshop应用选择题(1)全文共9页,当前为第2页。一级计算机基础及Photoshop应用选择题(1)全文共9页,当前为第2页。一级计算机基础及Photoshop应用选择题(1)全文共9页,当前为第2页。一级计算机基础及Photoshop应用选择题(1)全文共9页,当前为第2页。【解析】只能先将RGB模式转换为灰度模式,然后才能转换为模式。 一级计算机基础及Photoshop应用选择题(1)全文共9页,当前为第2页。 一级计算机基础及Photoshop应用选择题(1)全文共9页,当前为第2页。 一级计算机基础及Photoshop应用选择题(1)全文共9页,当前为第2页。 一级计算机基础及Photoshop应用选择题(1)全文共9页,当前为第2页。 减色系统中黄色与蓝色混合可以调配出的颜色是绿色 颜色深度为1的数字图像能够拥有的最多颜色数是2 【解析】颜色深度为1的数字图像,最多支持2(2的1次方)种颜色。 下列不支持图层功能的图像格式是BMP 【解析】PSD、TIFF和PDF支持图层功能,BMP是一种图文件格式。 下列属于矢量图形的文件格式是AI 【解析】后辍为AI的文件是illutrator制作的文件,其文件格式是矢量图。PSD、JPG、PNG 均为图图像的文件格式。 下列对工具箱的描述中,正确的是按Tab键可显示或隐藏工具箱 【解析】用户可以在操作的过程中,按Tab键,可以使工具箱显示或隐藏,这样可以使界面更 宽阔,能更好的观察到操作对象。 默认情况下新建文件的快捷键是Ctrl+N 【解析】新建文档的快捷键为Ctrl+N组合键。Ctrl+O组合键可打开文件。 当前图像的显示比例可以通过状态栏进行查看。 一级计算机基础及Photoshop应用选择题(1)全文共9页,当前为第3页。一级计算机基础及Photoshop应用选择题(1)全文共9页,当前为第3页。一级计算机基础及Photoshop应用选择题(1)全文共9页,当前为第3页。一级计算机基础及Photoshop应用选择题(1)全文共9页,当前为第3页。【解析】在状态栏,可以查看图像是缩放比例,也可以查看文档大小、文档尺寸、暂存盘大小等。 一级计算机基础及Photoshop应用选择题(1)全文共9页,当前为第3页。 一级计算机基础及Photoshop应用选择题(1)全文共9页,当前为第3页。 一级计算机基础及Photoshop应用选择题(1)全文共9页,当前为第3页。 一级计算机基础及Photoshop应用选择题(1)全文共9页,当前为第3页。 要显示/隐藏工具选项栏,其操作命令属于窗口菜单组。 【解析】在"窗口"菜单组中,当取消"工具"的选择时,则工具选项栏在文档窗口不显示。 下列关于横排文字工具的描述中,正确的是可以创建一个文字图层 【解析】当利用横排文字工

8,303

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧