C#下调用C++dll,显示一个TXT格式存储的图像文件

.Net技术 码拜 9年前 (2015-05-10) 962次浏览 0个评论
 

题目可能有点晕人。主题是,楼主把自己的解决方案说一下,请教各位大侠是否可行,有没有更好的办法?
—————我们要做的是
把TXT文件转换成图像,把转换图像的函数做成DLL,把图像句柄或者名字传入C#的WPF界面,在界面里流动显示图像
—————数据格式
楼主有一个TXT格式存储的图像文件大小为256*256*256Byte。像素存储方式为short型,即2Byte。
这是个多光谱的图像,所以是三维的,我们把这个数据立方体的数组形式写作DATA[x][y][spectrum]其中spectrum为0-127
而在txt里面的存储方式为DATA[x][y][0]DATA[x][y][1]DATA[x][y][2]…..DATA[x][y+1][0]……….DATA[x][y+2][0]
—————-然后我找到了赵老师编写的位图保存示范

#pragma comment(lib,"gdi32")
#include <windows.h>
#include <stdio.h>
 
int main() {
    const DWORD uWidth = 18 + 17 * 256, uHeight = 18 + 17 * 128;
 
    PBITMAPINFO pbmi = (PBITMAPINFO) LocalAlloc (LPTR, sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2);
    pbmi->bmiHeader.biSize = sizeof (BITMAPINFOHEADER);
    pbmi->bmiHeader.biWidth = uWidth;
    pbmi->bmiHeader.biHeight = uHeight;
    pbmi->bmiHeader.biPlanes = 1;
    pbmi->bmiHeader.biBitCount = 1;
    pbmi->bmiHeader.biSizeImage = ((uWidth + 31) & ~31) / 8 * uHeight;
    pbmi->bmiColors[0].rgbBlue = 0;
    pbmi->bmiColors[0].rgbGreen = 0;
    pbmi->bmiColors[0].rgbRed = 0;
    pbmi->bmiColors[1].rgbBlue = 255;
    pbmi->bmiColors[1].rgbGreen = 255;
    pbmi->bmiColors[1].rgbRed = 255;
 
    HDC hDC = CreateCompatibleDC (0);
    void * pvBits;
    HBITMAP hBitmap = CreateDIBSection (hDC, pbmi, 0, &pvBits, NULL, 0);
    SelectObject (hDC, hBitmap);
    HFONT hFont = CreateFont (16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "宋体");
//  HFONT hFont = CreateFont (16, 0, 0, 0, 0, 0, 0, 0, SHIFTJIS_CHARSET, 0, 0, 0, 0, "宋体");
    SelectObject (hDC, hFont);
    BitBlt (hDC, 0, 0, uWidth, uHeight, NULL, 0, 0, WHITENESS);
 
    char c[4];
    int i, j;
    for (i = 128; i < 256; i++) {
        sprintf (c, "%02X", i);
        TextOut (hDC, 1, (i - 127) * 17 + 1, c, 2);
    }
    for (j = 0; j < 256; j++) {
        sprintf (c, "%02X", j);
        TextOut (hDC, (j + 1)* 17 + 1, 1, c, 2);
    }
    for (i = 128; i < 256; i++) {
        for (j = 0; j < 256; j++) {
            c[0] = (char) i;
            c[1] = (char) j;
            TextOut (hDC, (j + 1) * 17 + 1, (i - 127) * 17 + 1, c, 2);
        }
    }
    for (i = 0; i < 130; i++) {
        MoveToEx (hDC, 0, i * 17, NULL);
        LineTo (hDC, uWidth, i * 17);
    }
    for (j = 0; j < 258; j++) {
        MoveToEx (hDC, j * 17, 0, NULL);
        LineTo (hDC, j * 17, uHeight);
    }
 
    BITMAPFILEHEADER bmfh;
    bmfh.bfType = *(PWORD) "BM";
    bmfh.bfReserved1 = 0;
    bmfh.bfReserved2 = 0;
    bmfh.bfOffBits = sizeof (BITMAPFILEHEADER) + sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2;
    bmfh.bfSize = bmfh.bfOffBits + pbmi->bmiHeader.biSizeImage;
 
    HANDLE hFile = CreateFile ("goal.bmp", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
    if (hFile != INVALID_HANDLE_VALUE) {
        DWORD dwWritten;
        WriteFile (hFile, &bmfh, sizeof (BITMAPFILEHEADER), &dwWritten, NULL);
        WriteFile (hFile, pbmi, sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2, &dwWritten, NULL);
        WriteFile (hFile, pvBits, pbmi->bmiHeader.biSizeImage, &dwWritten, NULL);
 
        CloseHandle (hFile);
    }
 
    DeleteObject (hFont);
    DeleteObject (hBitmap);
    DeleteDC (hDC);
    LocalFree (pbmi);
 
    return 0;
}

———————————–接下来我们把其封装成DLL,接口如下
extern “C” _declspec(dllimport) char* myturnfunc(char* txtname);
我想的是返回一个图像名称的指针比如图像叫作“myimageXXXX”这样,每一个名字大小都一样,就方便用一个后期用一个变量来遍历这些指针。
———————————–在WPF里显示图像,我还没有想法
———————————–
你问我为什么不直接在WPF里显示图像,因为格式有问题啊。
好吧,大概就是这样。。。
再重复一遍我们的问题是,这个方案可行么,有更好的实现方案么?

100分
指针返回的图片不知道能否正常使用,思路我觉得可行。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C#下调用C++dll,显示一个TXT格式存储的图像文件
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!