0

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

4

2 回答 2

1

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

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

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

我对 PDF 格式知之甚少,无法说明您需要做什么才能使其正常工作,但我的猜测是,您需要通过输出的 dpi 从纸张上的物理尺寸返回以获得尺寸以图像的像素为单位:

pixel width = physical width * dpi
于 2009-06-23T09:10:03.130 回答
0

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

于 2009-07-29T21:02:36.690 回答