Загрузить файл растрового изображения из неуправляемой DLL в управляемом коде - PullRequest
1 голос
/ 13 февраля 2012

Я пытаюсь загрузить изображение из dll неуправляемого ресурса и не смог обойти ошибку при преобразовании массива btye, извлеченного из dll, в растровое изображение.

Test.dllФайл содержит следующую структуру при просмотре в Visual Studio:
test.dll
Растровое изображение
+ 411
Значок
+1002 [Английский (США)

и когда ядважды щелкните по идентификатору 411 (узел Bimap). Я вижу файл bmp в редакторе растровых изображений, а когда дважды щелкаю по идентификатору 1002 (узел значков), я вижу различные значки в редакторе значков.

Итак, яуверен, что они являются допустимыми растровыми изображениями и значками, но когда я запускаю тест, описанный ниже, он не может преобразовать байтовый массив в изображение, так как ловит исключение с параметром «Недопустимый параметр Image.FromStream (...» ошибка.

Кто-нибудь знает, что это не так.

Код ниже:

public partial class Form1 : Form
{
    [DllImport("kernel32.dll", SetLastError = true)]
    static extern IntPtr 
        LoadLibraryEx(string lpFileName, IntPtr hFile, int dwFlags);

    [DllImport("kernel32.dll")]
    static extern IntPtr FindResource(IntPtr hModule, int lpName, int lpType);

    [DllImport("kernel32.dll", SetLastError = true)]
    static extern IntPtr LoadResource(IntPtr hModule, IntPtr hResInfo);

    [DllImport("kernel32.dll", SetLastError = true)]
    static extern uint SizeofResource(IntPtr hModule, IntPtr hResInfo);


    const int DATAFILE = 2;
    const int BITMAP_TYPE = 2;
    const int ICON_TYPE = 3;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }

    private void button1_Click(object sender, EventArgs e)
    {
        IntPtr loadLib = LoadLibraryEx("tsjcore.dll", IntPtr.Zero, DATAFILE);
        IntPtr findRes = FindResource(loadLib, 411, 2);
        IntPtr loadRes = LoadResource(loadLib, findRes);
        // Gives the correct size of image as
        uint size = SizeofResource(loadLib, findRes);  
        byte[] imageArray = new byte[size];
        // Loads the imageArray with data when viewed in debug mode.
        Marshal.Copy(loadRes, imageArray, 0, (int)size);
        Bitmap bitmap;
        try
        {
            using (MemoryStream memoryStream = new MemoryStream(imageArray))
            {
                bitmap = (Bitmap)Bitmap.FromStream(memoryStream);
            }
        }
        catch (Exception ex)
        {
            // displays parameter is not valid Image.FromStream(....
            MessageBox.Show(ex.ToString());
        }
    }
}

1 Ответ

2 голосов
/ 13 февраля 2012

Вы получаете указатель на BITMAPINFOHEADER, заголовок файла отсутствует. Таким образом, Image.FromStream () не может работать. Вместо этого введите Pinvoke LoadBitmap () и используйте Image.FromHbitmap ().

...