Получить PNG-изображение из собственного ресурса Win32 в .NET - PullRequest
4 голосов
/ 16 сентября 2011

Файл DLL содержит некоторые изображения внутри типа ресурсов PNG.

Я могу просматривать изображения PNG в таких программах, как Resource Hacker, Anolis Resourcer & Resource Tuner.Проверьте этот скриншот Anolis Resourcer для получения более подробной информации:

http://i51.tinypic.com/9pt93c.jpg

Может кто-нибудь сказать мне, как я могу получить изображение PNG №.5220 из файла DLL и положить его внутри PictureBox?Я не думаю, что такие API, как LoadImage или LoadBitmap будут работать.

Ответы [ 3 ]

6 голосов
/ 16 сентября 2011
// get the assembly containing the image
var assembly = Assembly.GetExecutingAssembly();

// set the picturebox image to read the embedded resource
pictureBox1.Image = Image.FromStream(
    assembly.GetManifestResourceStream("AssemblyName.test.png")
);

где AssemblyName.test.png - полное имя встроенного ресурса в сборке.


ОБНОВЛЕНИЕ:

Похоже, вы пытаетесь извлечь ресурсы изродная сборка.Вы можете взглянуть на следующую статью , которая иллюстрирует, как это можно сделать с помощью P / Invoke.

4 голосов
/ 28 сентября 2011

Ссылка, которую разместил Дарин (которая впоследствии была помечена как ответ), не содержит функционального кода.Я оценил размещенный там код (http://khason.net/blog/how-to-load-unmanaged-native-resources-from-managed-c-code/)) и обнаружил, что он не работает должным образом для любого растрового изображения, встроенного в любую DLL-библиотеку win32, в качестве ресурса растрового изображения.

Кроме того, Ганс Пассант пропускает множество шаговэффективно превращая его пост в бесполезный.

Единственное, что мне удалось найти, - это статья, написанная в 2004 году для мусорной корзины XP Theme. Вы можете найти метод GetResourcePNG в ThemeManager.cs здесь http://www.codeproject.com/KB/miscctrl/XPTaskBar.aspx

Однако следует отметить, что у меня возникли большие трудности с этим методом, так как вызов bitmap.RotateFlip (RotateFlipType.Rotate180FlipX) вызывает проблемы с памятью при попыткеДоступ к pngs в authui.dll на моей системе

Обновление:

Я нашел код, указанный здесь (http://www.vbaccelerator.com/home/NET/Code/Controls/Explorer_Bar/ExplorerBar_Control_Source_Code.asp), безусловно, самый функциональный, производятНаименьшее количество ошибок и дает самые быстрые результаты. Код написан на C #, хотя доменное имя будет указывать иначе. Использование двух классов;mageUtility и ResourceLibrary, вы можете легко извлечь PNG из стандартной библиотеки ресурсов, отличной от .net / dll:

    public static Bitmap GetStandardResourceBitmap(String dllName, String resourceId) {
        Bitmap result = null;

        using (ResourceLibrary library = new ResourceLibrary() { Filename = dllName }) {
            IntPtr hDib = library.GetResource(resourceId, ResourceLibrary.ImageType.IMAGE_BITMAP, ResourceLibrary.ImageLoadOptions.LR_CREATEDIBSECTION);
            if (!hDib.Equals(IntPtr.Zero)) {
                result = ImageUtility.DibToBitmap(hDib);
                ImageUtility.DeleteObject(hDib);
            }
        }

        return result;
    }

Я решил, что resourceId в моем методе - String, только потому, что это не так.требуется перегрузка и использование пронумерованных идентификаторов ресурсов так же просто, как и добавление '#'.

GetStandardResourceBitmap("shell32.dll", "#632");

Cheers

3 голосов
/ 17 сентября 2011

Изображение PNG не относится к стандартным типам ресурсов Win32.Обычно он встроен в виде двоичного двоичного объекта с именованным типом ресурса «PNG», хотя это не гарантируется.Безусловно, самый простой способ сделать это - просто открыть файл с помощью команды Visual Studio File + Open + File.Найдите ресурс обратно, щелкните его правой кнопкой мыши и выберите «Экспорт», чтобы сохранить его на диске.

Выполнение этого программным способом требует большого количества сложных действий.Это сложно, потому что тип ресурса и идентификатор ресурса могут быть либо строкой, либо IntPtr, поэтому вам понадобится 4 перегрузки для FindResource.Для того, чтобы загрузить файл без выполнения какого-либо его кода, вам понадобится LoadLibraryEx ().FindResource, чтобы получить дескриптор ресурса.SizeOfResource, чтобы узнать, насколько он велик.LoadResource + LockResource для получения указателя на данные ресурса.Marshal.Copy () для копирования данных ресурса в байт [].Очистите с помощью FreeResource и FreeLibrary.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...