Сохранить изображение с сохранением разрешения в C # - PullRequest
0 голосов
/ 23 июня 2009

Я пытаюсь обрезать изображение. Я нашел несколько способов сделать это, однако ни один не работает так, как мне бы хотелось. Как только изображение обрезается, я отправляю его в генератор PDF. Если я отправляю обычный jpg, он работает нормально, однако, если я обрезаю изображение, оно не попадает в PDF с правильным размером. Я думаю, что это может быть связано с разрешением.

В html-виде он выглядит хорошо, но при публикации в PDF изображение получается меньше ожидаемого.

Вот код обрезки, который я использую:

            try
        {
            System.Drawing.Image image = System.Drawing.Image.FromFile(img);
            Bitmap bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb);
            bmp.SetResolution(image.HorizontalResolution, image.VerticalResolution);

            Graphics gfx = Graphics.FromImage(bmp);
            gfx.SmoothingMode = SmoothingMode.AntiAlias;
            gfx.InterpolationMode = InterpolationMode.HighQualityBicubic;
            gfx.PixelOffsetMode = PixelOffsetMode.HighQuality;
            gfx.DrawImage(image, new Rectangle(0, 0, width, height), x, y, width, height, GraphicsUnit.Pixel);
            // Dispose to free up resources
            image.Dispose();
            //bmp.Dispose();
            gfx.Dispose();

            return bmp;
        }
        catch (Exception ex)
        {
            //MessageBox.Show(ex.Message);
            return null;
        }

Я также пробовал это:

Bitmap temp = (Bitmap)System.Drawing.Image.FromFile(img);
        Bitmap bmap = (Bitmap)temp.Clone();
        if (xPosition + width > temp.Width)
            width = temp.Width - xPosition;
        if (yPosition + height > temp.Height)
            height = temp.Height - yPosition;
        Rectangle rect = new Rectangle(xPosition, yPosition, width, height);
        temp = (Bitmap)bmap.Clone(rect, bmap.PixelFormat);

Я записываю это в контекстный поток:

Bitmap bm = Helper.CropImage(@"MyFileLocation", 0, 0, 300, 223);
        context.Response.ContentType = "image/jpg";
        bm.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
        bm.Dispose();

Интересно, что когда я пытаюсь изменить изображение и изменить тип контекста, я получаю общую ошибку GDI +. По результатам исследований это выглядит как вопрос поиска, но не уверен, как его решить.

Ответы [ 2 ]

1 голос
/ 23 июня 2009

При использовании PDF вы должны иметь в виду, что вы смотрите на разрешение печати, а не на разрешение экрана.

Изображение размером 600 x 600 пикселей занимает приблизительно половину ширины экрана на мониторе с разрешением 1280 x 1024.

Однако, если вывод на печать составляет 200 точек на дюйм, он будет занимать 3 дюйма, но если он установлен на 300 точек на дюйм, он будет занимать только 2 дюйма.

Я не знаю достаточно о формате PDF, чтобы сказать, что вам нужно сделать, чтобы заставить это работать, но я предполагаю, что вам нужно вернуться к физическому размеру на бумаге через dpi вывода в получить размер в пикселях изображения:

pixel width = physical width * dpi
0 голосов
/ 30 июля 2009

Что касается проблемы с ошибкой GDI +, попробуйте сначала сохранить ее в памяти, а затем скопировать ее в Response.OutputStream. Если Tiff похож на PNG, поток действительно должен быть доступен для поиска.

...