Как можно рендерить изображение PNG (в виде потока памяти) на поверхность отчета .NET ReportViewer - PullRequest
12 голосов
/ 31 августа 2008

У меня есть динамически созданное изображение, которое я сохраняю в поток, чтобы я мог отобразить его на поверхности ReportViewer.

Установка:

  • Клиентское приложение Windows (не WebForms)
  • Источник данных отчета - это объектный источник данных с динамически генерируемым потоком в качестве свойства (CustomImage)
  • Report.EnableExternalImages = true
  • Image.Source = База данных
  • Image.MIMEType = image / png
  • Image.Value = = Поля! CustomImage.Value

Это не работает, но не сообщает об ошибках, просто показывает пустой значок изображения на поверхности отчета. Все остальные поля отображаются правильно.

У кого-нибудь есть пример рабочего кода этого сценария?

1 Ответ

26 голосов
/ 01 октября 2008

Я делаю что-то похожее, чтобы в отчетах менялся логотип, но для передачи значения я использую параметры отчета. Я не вижу причин, почему этот общий метод не работал бы, если бы изображения были частью данных.

По сути изображения передаются по двум полям. Первое поле - это значение типа MIME, а второе поле - строка в кодировке Base64, содержащая содержимое изображения.

Шаг 1. Преобразование изображения в кодировку Base64. (Наш код всегда передает ImageFormat.Png этому методу, чтобы упростить MIME Type)

private static string ConvertImageToBase64(Image image, ImageFormat format)
{
    byte[] imageArray;

    using (System.IO.MemoryStream imageStream = new System.IO.MemoryStream())
    {
        image.Save(imageStream, format);
        imageArray = new byte[imageStream.Length];
        imageStream.Seek(0, System.IO.SeekOrigin.Begin);
        imageStream.Read(imageArray, 0, imageStream.Length);
    }

    return Convert.ToBase64String(imageArray);
}

Шаг 2. Передайте изображение и тип MIME в отчет.

reportParams[0] = new ReportParameter("ReportLogo", base64Logo);
reportParams[1] = new ReportParameter("ReportLogoMimeType", "image/png");

_reportViewer.LocalReport.SetParameters(reportParams);

Шаг 3: В отчете установите следующие свойства изображения (без кавычек):

  • MIMEType: "=Parameters!ReportLogoMimeType.Value"
  • Значение: "=System.Convert.FromBase64String(Parameters!ReportLogo.Value)"
  • ОБНОВЛЕНИЕ: Как говорит Герардо ниже, источник изображения должен быть установлен в «База данных»

Ловушка для молодых игроков: Часто изображения выглядят ужасно и, как будто они были масштабированы, даже если вы передаете изображение, которое кажется «правильного размера». Это связано с тем, что отчеты выводятся на печать (300 т / д), а не на экран (обычно 72 или 92 т / д). Исправление заключается в том, чтобы отправить изображение примерно в 3 раза больше, установить его правильный размер в отчете и изменить свойство "Sizing" на изображении на "FitProportional".

...