【问题标题】:PDFsharp - Image drawn with transparencyPDFsharp - 以透明度绘制的图像
【发布时间】:2015-07-16 08:40:41
【问题描述】:

我目前正在开发 PDF 生成器。我需要先绘制背景图像,然后绘制一个透明度为 85% 的暗层。我可以很好地绘制它,但是当我想在之后绘制两张图像时,这些图像也会获得透明度,这不是我想要的。

XBrush brush = new XSolidBrush(XColor.FromArgb((int)(.85 * 255), 255, 255, 255));
DrawPageBackground(gfx,backgroundImage,page.Width.Value,page.Height.Value);
gfx.DrawRectangle(b,0,0,gfx.PageSize.Width,gfx.PageSize.Height );
gfx.DrawImage(otherImage,25,25);

有什么理由我不能只绘制没有透明度的图像吗?只是我现在没有做的简单的事情吗?

谢谢。

【问题讨论】:

  • 您为画笔设置的透明度(在您的代码sn-p中没有使用)对图像的透明度没有影响。使用图像中设置的透明度绘制图像。
  • 图像具有透明背景,“徽标”本身不透明(因为它是白色文本)。但是需要在绘制透明暗层后恢复XGraphics对象的GraphicsState来解决这个问题。我不知道为什么图像的绘制会受到画笔的影响,即使我知道图像不能设置为较低的透明度。
  • @PDFsharpTeam:DrawPageBackground 方法(其内容可以在我自己的答案中看到)仅将背景图像调整为正确的分辨率以垂直适合 pdf 页面。

标签: c# pdf pdfsharp


【解决方案1】:

我确实通过在绘制带有深色图层的背景之前保存 XGraphicsState 成功解决了这个问题。绘图后,我使用 XGraphicsState 来恢复和绘制没有任何透明度的图像。请参阅以下代码。

XGraphicsState state = gfx.Save();
XBrush brush = new XSolidBrush(XColor.FromArgb((int)(.85 * 255), 255, 255, 255));
DrawPageBackground(gfx,backgroundImage,page.Width.Value,page.Height.Value);
gfx.DrawRectangle(b,0,0,gfx.PageSize.Width,gfx.PageSize.Height );
gfx.DrawImage(otherImage,25,25);
gfx.Restore(state);

DrawPageBackground 方法:

private static void DrawPageBackground(XGraphics gfx, XImage image, double pageWidth, double pageHeight)
{
    if (image.Size.Width > pageWidth)
        gfx.DrawImage(image, CalculateDiffImageCenterToPageCenter(image,pageWidth), 0, CalculateBackgroundImageWidth(image,pageHeight), pageHeight);
    else
        gfx.DrawImage(image, 0, 0, CalculateBackgroundImageWidth(image, pageHeight),pageHeight);
}

这只是将背景图像绘制到正确比例并居中的辅助方法。

【讨论】:

  • @PDFsharpTeam:我在反应中添加了方法。这不是可能影响问题的方法。此外,该辅助方法还依赖于几个仅包含数学内容的辅助方法(计算与另一个公制尺寸相关的对象的宽度和高度)
  • 副作用来自刷子b(sn-p中未显示出处)而不是刷子brush(创建但未在sn-p中使用)。可能是 PDFsharp 中的错误。暂时把对DrawRectangle()的调用用Save()Restore()封装起来,避免副作用。
  • b就是如下:XSolidBrush b = new XSolidBrush(XColor.FromArgb(169, 0, 0, 0));。我确实用Save()Restore() 封装了对DrawRectangle() 的调用。但我觉得这很奇怪,而且我认为这是不受欢迎的行为。
【解决方案2】:

我确认我在评论中写的内容:为画笔设置的透明度也应用于图像是一个错误。

在本周早些时候发布的 1.50.3915-beta2 版本中,此错误已得到修复。

使用Save()Restore() 是早期版本的合适解决方法,但对于最新版本,不再需要此解决方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    • 2018-04-02
    • 2014-06-01
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多