Есть ли в WPF IconBitmapEncoder? - PullRequest
1 голос
/ 15 марта 2012

Я создаю изображения в различных форматах в WPF, используя BitmapEncoder. Например, чтобы создать изображение PNG из FrameworkElement, я использую следующий код,

        BitmapEncoder imgEncoder = new PngBitmapEncoder();
        RenderTargetBitmap renderBitmap = new RenderTargetBitmap(32, 32, 96d, 96d, PixelFormats.Pbgra32);
        renderBitmap.Render(controlToConvert);
        imgEncoder.Frames.Add(BitmapFrame.Create(renderBitmap));

Мне нравится создавать файл .ico таким же образом. Но я не могу найти IconBitmapEncoder в WPF . Есть ли другой способ сделать это?

С уважением,

Джавахар

Ответы [ 3 ]

1 голос
/ 17 марта 2012

Там нет ни одного.

Я пытался сохранить изображения как * .ico в прошлом, и другие классы .NET не очень помогли (если я правильно помню, они могли только декодировать, а не кодировать; но, возможно,я просто сделал что-то не так).* .ico может быть контейнером для изображений PNG (хотя могут быть проблемы с обратной совместимостью), поэтому вы можете вставить туда полный PNG с правильными заголовками, которые можно найти в википедии .

Пример реализации:

public static class PngToIcoConverter
{
    public static byte[] Convert(byte[] data)
    {
        Image source;
        using (var inStream = new MemoryStream(data))
        {
            source = Image.FromStream(inStream);
        }
        byte[] output;
        using (var outStream = new MemoryStream())
        {
            // Header
            {
                // Reserved
                outStream.WriteByte(0);
                outStream.WriteByte(0);
                // File format (ico)
                outStream.WriteByte(1);
                outStream.WriteByte(0);
                // Image count (1)
                outStream.WriteByte(1);
                outStream.WriteByte(0);
            }

            // Image entry
            {
                // Width
                outStream.WriteByte((byte)source.Width);
                // Height
                outStream.WriteByte((byte)source.Height);
                // Number of colors (0 = No palette)
                outStream.WriteByte(0);
                // Reserved
                outStream.WriteByte(0);
                // Color plane (1)
                outStream.WriteByte(1);
                outStream.WriteByte(0);
                // Bits per pixel
                var bppAsLittle = IntToLittle2(Image.GetPixelFormatSize(source.PixelFormat));
                outStream.Write(bppAsLittle, 0, 2);
                // Size of data in bytes
                var byteCountAsLittle = IntToLittle4(data.Length);
                outStream.Write(byteCountAsLittle, 0, 4);
                // Offset of data from beginning of file (data begins right here = 22)
                outStream.WriteByte(22);
                outStream.WriteByte(0);
                outStream.WriteByte(0);
                outStream.WriteByte(0);
                // Data
                outStream.Write(data, 0, data.Length);
            }
            output = outStream.ToArray();
        }
        return output;
    }

    private static byte[] IntToLittle2(int input)
    {
        byte[] b = new byte[2];
        b[0] = (byte)input;
        b[1] = (byte)(((uint)input >> 8) & 0xFF);
        return b;
    }
    private static byte[] IntToLittle4(int input)
    {
        byte[] b = new byte[4];
        b[0] = (byte)input;
        b[1] = (byte)(((uint)input >> 8) & 0xFF);
        b[2] = (byte)(((uint)input >> 16) & 0xFF);
        b[3] = (byte)(((uint)input >> 24) & 0xFF);
        return b;
    }
}
1 голос
/ 22 декабря 2013

Я знаю, что на вопрос уже был дан ответ, но недавно я написал статью о Code Project, где я делюсь исходным кодом IconBitmapEncoder. Он кодирует BitmapImage в файлах значков без необходимости использования сторонних библиотек DLL или использования форм Win. 100% Windows Presentation Foundation.

Высококачественный IconBitmapEncoder для WPF

Я ожидаю, что это будет полезно для вас.

0 голосов
/ 15 марта 2012

MSDN говорит, что «IcoBitmapEncoder» не существует.Я мог бы предложить вам получить Bitmap из BitmapFrame и затем преобразовать его в значок, например:

    BitmapEncoder imgEncoder = new PngBitmapEncoder();
    RenderTargetBitmap renderBitmap = new RenderTargetBitmap(32, 32, 96d, 96d, PixelFormats.Pbgra32);
    renderBitmap.Render(comboBox1);
    var frame = BitmapFrame.Create(renderBitmap);

    Bitmap bitmap = GetBitmap(frame);
    bitmap.SetResolution(72, 72);
    System.Drawing.Icon icon = System.Drawing.Icon.FromHandle(bitmap.GetHicon());
    FileStream fs = new FileStream(filename, FileMode.OpenOrCreate);
    icon.Save(fs);
    fs.Close();

Метод GetBitmap, который можно получить из здесь :

    static Bitmap GetBitmap(BitmapSource source)
    {
        Bitmap bmp = new Bitmap(source.PixelWidth, source.PixelHeight, 
            System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
        BitmapData data = bmp.LockBits(
            new System.Drawing.Rectangle(System.Drawing.Point.Empty, bmp.Size), ImageLockMode.WriteOnly, 
            System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
        source.CopyPixels(Int32Rect.Empty, data.Scan0, data.Height * data.Stride, data.Stride);
        bmp.UnlockBits(data);
        return bmp;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...