我正在使用C++ Builder XE3开发一个图形编辑器。所有编辑和绘图功能都是在最终用户应用程序加载的DLL中完成的。为了存储有关可用图形对象的信息,我使用SQLite数据库。该数据库包含BMP图标,在运行时加载到TImageList中.
Win-7,Win-8和Win-vista一切都很好,但是对于Win-XP,在加载位图时会出现“浮点除法”。我使用一个临时内存流从数据库加载blob,然后将其加载到一个临时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函数有问题,但是我不知道是什么!
如果有人有主意..。谢谢。
发布于 2013-08-26 09:29:06
LoadFromFile是通过创建文件流并将其传递给LoadFromStream来实现的。这样,如果内存流的内容与文件的内容相同,那么对LoadFromStream的调用就会成功。
因此,唯一明智的结论是,内存流的内容在某种程度上是无效的。
发布于 2013-08-26 10:11:32
存储到数据库中的位图使用BITMAPV4HEADER结构进行编码,这应该是Win95 95/NT4所支持的,但是有问题。
如果我使用BITMAPINFOHEADER结构对位图进行编码,它工作得很好,BITMAPINFOHEADER结构是位图编码的旧版本,它不包含颜色空间信息。
发布于 2013-12-16 12:47:36
我刚找到了一个对我有用的解决方案。
我的问题是,在Win7上开发的软件,当运行在XP上时,在加载我的一个BMP时,会以0的错误抛出除法。
结果发现,有问题的BMP是使用Win7油漆保存的(其他BMPs可以从Gimp中保存)。
为了修复它,我所需要做的就是在XP油漆上打开这个BMP并将它保存在那里。
https://stackoverflow.com/questions/18440861
复制相似问题