Откройте и отобразите HD Photo в приложении WinForms - PullRequest
1 голос
/ 12 апреля 2011

Я пишу небольшую программу, в которой я хотел бы обрабатывать различные типы изображений, в том числе: «HD Photo» или «JPEG XR».1003 * но я получаю OutOfMemoryException.Я пытался найти некоторые решения, но несколько драгоценных результатов, которые я нашел, вызвало у меня подозрение, что это может работать только в приложении WPF.Это правда?Если нет, то как я могу открыть такой файл, чтобы я мог поместить его в Picturebox?

1 Ответ

1 голос
/ 13 апреля 2011

Я нашел приемлемый обходной путь. Я написал небольшую библиотеку элементов управления WPF, которая загружает HD-фотографии и возвращает System.Drawing.Bitmap.

Это комбинация этого и этого вопроса с добавлением небольшого количества моих собственных улучшений. Когда я пробовал исходный источник, у меня была проблема, что изображение исчезало при изменении размера картинная коробка. Возможно, это связано с указанием массива для информации об изображении. Рисуя изображение во втором безопасном растровом изображении, мне удалось избавиться от этого эффекта.

public class HdPhotoLoader
{
    public static System.Drawing.Bitmap BitmapFromUri(String uri)
    {
        return BitmapFromUri(new Uri(uri, UriKind.Relative));
    }

    public static System.Drawing.Bitmap BitmapFromUri(Uri uri)
    {
        Image img = new Image();
        BitmapImage src = new BitmapImage();
        src.BeginInit();
        src.UriSource = uri;
        src.CacheOption = BitmapCacheOption.OnLoad;
        src.EndInit();
        img.Source = src;

        return BitmapSourceToBitmap(src);
    }

    public static System.Drawing.Bitmap BitmapSourceToBitmap(BitmapSource srs)
    {
        System.Drawing.Bitmap temp = null;
        System.Drawing.Bitmap result;
        System.Drawing.Graphics g;
        int width = srs.PixelWidth;
        int height = srs.PixelHeight;
        int stride = width * ((srs.Format.BitsPerPixel + 7) / 8);

        byte[] bits = new byte[height * stride];

        srs.CopyPixels(bits, stride, 0);

        unsafe
        {
            fixed (byte* pB = bits)
            {

                IntPtr ptr = new IntPtr(pB);

                temp = new System.Drawing.Bitmap(
                      width,
                      height,
                      stride,
                      System.Drawing.Imaging.PixelFormat.Format32bppPArgb,
                      ptr);
            }

        }

        // Copy the image back into a safe structure
        result = new System.Drawing.Bitmap(width, height);
        g = System.Drawing.Graphics.FromImage(result);

        g.DrawImage(temp, 0, 0);
        g.Dispose();

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