2015-07-16 3 views
1

В настоящее время я работаю над генератором PDF. Мне нужно сначала нарисовать фоновое изображение, а затем нарисовать темный слой с 85% прозрачности. Я могу сделать это красиво, но когда я хочу нарисовать два изображения после этого, эти изображения также получат прозрачность, и это не то, что я хочу.PDFsharp - Изображение с прозрачностью

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); 

Есть ли причина, по которой я не могу просто нарисовать изображения без прозрачности? Это просто что-то простое, что я сейчас не делаю?

Спасибо.

+0

Прозрачность, которую вы установили для кисти (которая не используется в фрагменте кода) не влияет на прозрачность изображения. Изображения рисуются с прозрачностью, установленной на изображении. –

+0

Изображение имеет прозрачный фон, сам логотип не прозрачен (как белый текст). Но GraphicsState объекта XGraphics необходимо восстановить после рисования прозрачного темного слоя, чтобы исправить эту проблему. Я не знаю, почему на рисунок изображения влияет кисть, даже если я знаю, что изображение не может быть установлено на более низкую прозрачность. –

+0

@PDFsharpTeam: метод DrawPageBackground (содержимое которого можно увидеть в моем собственном ответе) изменяет только фоновое изображение на правильное разрешение, чтобы вертикально вставить страницу pdf. –

ответ

0

Я успешно исправить эту проблему, сохранив 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); 
} 

Это просто вспомогательный метод, чтобы сделать фоновое изображение в нужном масштабе и в центре его.

+0

@PDFsharpTeam: Я добавил метод в реакцию. Это не способ, который может повлиять на проблему. Кроме того, этот вспомогательный метод также зависит от нескольких вспомогательных методов, которые содержат только математические данные (вычисление ширины и высоты объектов в зависимости от другого размера метрики). –

+0

Побочный эффект происходит от кисти 'b' (источник не показан в фрагменте) а не кистью 'brush' (созданной, но не используемой в фрагменте). Может быть ошибка в PDFsharp. Пока что инкапсулируйте вызов 'DrawRectangle()' с помощью 'Save()' и 'Restore()', чтобы избежать побочного эффекта. –

+0

Кисть 'b' выглядит следующим образом:' XSolidBrush b = новый XSolidBrush (XColor.FromArgb (169, 0, 0, 0)); '. Я действительно инкапсулирую вызов 'DrawRectangle()' с помощью 'Save()' и 'Restore()'. Но я нахожу это очень странным и, я полагаю, не хотел поведения. –

0

Я подтверждаю, что я написал в комментарии: это ошибка, что прозрачность, установленная для кисти, также применяется к изображениям.

С версией 1.50.3915-beta2, опубликованной ранее на этой неделе, эта ошибка была исправлена.

Использование Save() и Restore() является подходящим решением для более ранних версий, но с последней версией это обходное решение больше не требуется.

Смежные вопросы