我正在使用C ++ Builder XE3开发图形编辑器。所有编辑和绘图功能都在最终用户应用程序加载的DLL中进行。 为了存储有关可用图形对象的信息,我使用SQLite数据库。该数据库包含在运行时加载到TImageList中的BMP图标。
Win-7,Win-8和Win-vista都可以正常工作,但是在加载位图时,Win-XP会出现“浮点除0”。我使用临时内存流从数据库加载blob,然后将其加载到临时TBitmap中,该TBitmap用于将新图标添加到最终的TImageList中。
以下是用于执行此操作的函数...
void TIcons::AddMaskedBitmap( TImageList *ptImgList, unsigned char *pucIcon, unsigned int uiSize )
{
TMemoryStream *ptMemStream;
// Use a memory stream
ptMemStream = new TMemoryStream();
ptMemStream->Write( pucIcon, uiSize );
ptMemStream->Position = 0;//Seek( ( int )0, ( unsigned short )soBeginning );
// Load using the cached bmp object
m_ptBmp->Transparent = true;
#warning "floatting point division by 0 error with WinXP"
m_ptBmp->LoadFromStream( ptMemStream ); // floatting point division by 0 error with WinXP
// m_ptBmp->LoadFromFile( ".\\d.bmp" ); // works
// Create a mask
m_ptBmpMask->Assign( m_ptBmp );
m_ptBmpMask->Canvas->Brush->Color = m_ptBmp->TransparentColor;
m_ptBmpMask->Monochrome = true;
// Add it to the list
ptImgList->Add( m_ptBmp, m_ptBmpMask );
// Free mem
m_ptBmp->FreeImage();
m_ptBmpMask->FreeImage();
delete ptMemStream;
}
我已经跟踪了TBitmap :: LoadFromStream函数,并且在CreateDIBSection函数中发生了异常。
为了确保使用正确的编码保存加载的位图文件我尝试使用TBitmap :: LoadFromFile函数加载它们并且它工作正常,所以我认为TBitmap :: LoadFromStream函数有问题但是我无法弄清楚是什么!
如果有人有想法...... 感谢。
答案 0 :(得分:0)
LoadFromFile
是通过创建文件流并将其传递给LoadFromStream
来实现的。这样,如果内存流的内容与文件内容相同,则对LoadFromStream
的调用将成功。
因此,唯一可靠的结论是内存流的内容在某种程度上是无效的。
答案 1 :(得分:0)
存储在数据库中的位图使用BITMAPV4HEADER结构进行编码,该结构应该在Win95 / NT4之后得到支持,但是有些错误。
如果我使用BITMAPINFOHEADER结构对位图进行编码,它可以正常工作,该结构是不包含颜色空间信息的旧版位图编码。
答案 2 :(得分:0)
刚刚找到了适合我的解决方案。
我的问题是在Win7上开发的软件在XP上运行时在加载我的一个BMP时抛出了0分错误。
事实证明,使用Win7 Paint保存了有问题的BMP(其他可以从Gimp保存的BMP)。
我需要做的就是在XP Paint上打开这个BMP并从那里保存它。