【问题标题】:Save Image Preserving Resolution in C#在 C# 中保存图像保留分辨率
【发布时间】:2010-11-05 02:35:58
【问题描述】:

我正在尝试裁剪图像。我找到了多种方法来做到这一点,但是没有一种方法能达到我想要的效果。裁剪图像后,我会将其发送到 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+ 错误。从研究来看,这似乎是一个搜索问题,但也不确定如何解决。

【问题讨论】:

  • 你是如何发布到 Pdf 的?

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    我对 PDF 格式的了解还不够,无法说明您需要做什么才能使其正常工作,但我的猜测是您需要通过输出的 dpi 从纸张上的物理尺寸恢复到获取图像的像素大小:

    pixel width = physical width * dpi
    

    【讨论】:

      猜你喜欢
      • 2016-12-18
      • 1970-01-01
      • 2020-01-15
      • 1970-01-01
      • 2014-10-03
      • 2015-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多