从浮点数组创建可视C++图像

Creating a Grayscale image in Visual C++ from a float array

本文关键字:可视 C++ 图像 创建 数组      更新时间:2023-10-16

我有一个灰度像素值数组(浮点数为 1 的分数),我需要显示,然后可能保存。这些值只是来自计算,所以我目前没有安装库或任何东西。我一直在尝试找出 CImage 库,但无法理解我需要做什么来可视化这些数据。任何帮助将不胜感激!

谢谢。

我使用的一种可能的方法取得了一些成功,那就是采用 D3DX 的纹理函数来创建 Direct3D 纹理并填充它。启动 D3D 有一些开销,但它为您提供了多线程纹理创建和内置查看功能,以及无需大惊小怪地保存到文件。

如果您对使用 D3D(X) 不感兴趣,这里的一些细节将没有用,但生成器应该有助于弄清楚如何为任何其他库输出数据。

例如,假设现有的 D3D9 设备pDevice和噪声发生器(或其他纹理数据源)pGen

IDirect3DTexture9 * pTexture = nullptr;
D3DXCreateTexture(pDevice, 255, 255, 0, 0, D3DFMT_R8G8B8, D3DPOOL_DEFAULT, &pTexture);
D3DXFillTexture(pTexture, &texFill, pGen);
D3DXSaveTexture("texture.png", D3DXIFF_PNG, pTexture, NULL);

发电机功能:

VOID WINAPI texFill(
    D3DXVECTOR4* pOut, 
    CONST D3DXVECTOR2* pTexCoord, 
    CONST D3DXVECTOR2* pTexelSize, 
    LPVOID pData,  
) {
    // For a prefilled array:
    float * pArray = (float *)pData;
    float initial = pArray[(pTexCoord->y*255)+pTexCoord->x];
    // For a generator object:
    Generator * pGen = (Generator*)pData; // passed in as the third param to fill
    float initial = pGen->GetPixel(pTexCoord->x, pTexCoord->y);
    pOut->x = pOut->y = pOut->z = (initial * 255);
    pOut->w = 255; // set alpha to opaque
}
  • D3DXCreateTexture: http://msdn.microsoft.com/en-us/library/windows/desktop/bb172800%28v=vs.85%29.aspx
  • D3DXFillTexture: http://msdn.microsoft.com/en-us/library/windows/desktop/bb172833(v=vs.85).aspx
  • D3DXSaveTextureToFile: http://msdn.microsoft.com/en-us/library/windows/desktop/bb205433(v=vs.85).aspx

相应的功能可用于体积/3D 纹理。由于它们已经针对 D3D 进行了设置,因此您可以简单地将纹理渲染为平面四边形进行查看,或用作您想要的任何图形应用程序中的源。

只要生成器是线程安全的,您就可以在每个纹理的一个线程中运行创建/填充/保存,并同时生成多个切片或帧。

我发现这个问题的最佳解决方案是使用SFML库(www.sfml-dev.org)。使用起来非常简单,但如果要与VS2010一起使用,则必须从源代码编译。

您可以使用 PNM 图像格式,而无需任何库。(格式本身是微不足道的)。但是,它非常古老,您必须有一个支持它的图像查看器。例如,IvanView在Windows上支持它。