在C#中保存图像保留分辨率

时间:2009-06-23 08:52:02

标签: c# asp.net image-processing image-manipulation

我正在尝试裁剪图像。我已经找到了多种方法来做到这一点,但是没有一种方法可以表现我的想法。裁剪图像后,我将其发送到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();

有趣的是,当我尝试使用tiff图像并更改上下文类型时,我收到了一个通用的GDI +错误。从研究来看,这看起来像是一个寻求问题,但也不确定如何解决它。

2 个答案:

答案 0 :(得分:1)

使用PDF时,您必须记住您正在查看打印分辨率而不是屏幕分辨率。

在1280 x 1024分辨率的显示器上,600 x 600像素的图像将占据屏幕宽度的大约一半。

但是,如果打印输出为200 dpi,它将占用3英寸,但如果设置为300 dpi,则仅占用2英寸。

我对PDF格式的了解不足以说明你需要做些什么才能让它发挥作用,但我的猜测是你需要通过输出的dpi从纸张上的物理尺寸开始工作。得到图像的像素大小:

pixel width = physical width * dpi

答案 1 :(得分:0)

关于GDI +错误问题,请先尝试保存到内存流,然后将其复制到Response.OutputStream。如果Tiff与PNG类似,那么该流确实需要是可搜索的。