0

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

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

4

3 回答 3

0

LoadFromFile通过创建文件流并将其传递给LoadFromStream. 这样,如果您的内存流的内容与文件的内容相同,则调用LoadFromStream将成功。

因此,唯一合理的结论是内存流的内容在某种程度上是无效的。

于 2013-08-26T09:29:06.623 回答
0

存储到数据库中的位图是使用 BITMAPV4HEADER 结构编码的,从 Win95/NT4 开始应该支持该结构,但出现了问题。

如果我使用 BITMAPINFOHEADER 结构对位图进行编码,它可以正常工作,该结构是位图编码的旧版本,不包含颜色空间信息。

于 2013-08-26T10:11:32.737 回答
0

刚刚找到了一个适合我的解决方案。

我的问题是,在 Win7 上开发的软件,在 XP 上运行时,在加载我的一个 BMP 时会抛出除以 0 的错误。

事实证明,有问题的 BMP 是使用 Win7 Paint 保存的(其他正常的 BMP 是从 Gimp 保存的)。

我需要做的就是在 XP Paint 上打开这个 BMP 并从那里保存它。

于 2013-12-16T12:47:36.843 回答