TBitmap-> LoadFromStream因Win XP而失败

时间:2013-08-26 09:25:58

标签: c++builder c++builder-xe3

我正在使用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函数有问题但是我无法弄清楚是什么!

如果有人有想法...... 感谢。

3 个答案:

答案 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并从那里保存它。