2008-08-31 19 views
12

Tôi có hình ảnh được tạo động mà tôi đang lưu vào luồng để tôi có thể hiển thị hình ảnh trên bề mặt ReportViewer.Làm cách nào để hiển thị hình ảnh PNG (dưới dạng luồng bộ nhớ) trên bề mặt báo cáo .NET ReportViewer

Setup:

  • ứng dụng Windows Client (không WebForms)
  • Báo cáo nguồn dữ liệu là một đối tượng nguồn dữ liệu, với một dòng suối tự động tạo ra như một tài sản (CustomImage)
  • Report.EnableExternalImages = true
  • Image.Source = Cơ sở dữ liệu
  • Image.MIMEType = image/png
  • Image.Value = = Fields! CustomI mage.Value

Điều này không hoạt động, nhưng không báo cáo bất kỳ lỗi nào, chỉ hiển thị biểu tượng hình ảnh trống trên bề mặt báo cáo. Tất cả các trường khác đang hiển thị chính xác.

Có ai có mẫu mã hoạt động của trường hợp này không?

Trả lời

26

Tôi đang làm điều tương tự để có biểu tượng thay đổi trên báo cáo tuy nhiên tôi sử dụng các thông số báo cáo để chuyển giá trị. Tôi không thấy lý do nào tại sao phương pháp chung này sẽ không hoạt động nếu hình ảnh là một phần của dữ liệu.

Về cơ bản hình ảnh được truyền qua hai trường. Trường đầu tiên là giá trị MIME Type và trường thứ hai là một chuỗi được mã hóa Base64 chứa nội dung hình ảnh.

Bước 1: Chuyển đổi hình ảnh của bạn sang mã hóa Base64. (Mã của chúng tôi luôn đi ImageFormat.Png để phương pháp này để làm cho các loại MIME dễ dàng)

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

Bước 2: Vượt qua hình ảnh và MIME Type để báo cáo.

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

_reportViewer.LocalReport.SetParameters(reportParams); 

Bước 3: Trong báo cáo thiết lập các thuộc tính sau vào hình ảnh (không có dấu ngoặc kép):

  • MIMETYPE: " =Parameters!ReportLogoMimeType.Value "
  • Value: " =System.Convert.FromBase64String(Parameters!ReportLogo.Value) "
  • CẬP NHẬT: Là Ger ARDO cho biết dưới đây, hình ảnh nguồn phải được đặt thành 'Database'

Trap dành cho cầu thủ trẻ: Thường thì hình ảnh sẽ trông khủng khiếp và giống như họ đã được thu nhỏ lại ngay cả khi bạn đang đi trong một hình ảnh mà có vẻ là "kích thước phù hợp". Điều này là do các báo cáo được hiển thị để in (300 dpi) chứ không phải màn hình (thường là 72 hoặc 92 dpi). Khắc phục là gửi hình ảnh quá lớn gấp 3 lần, đặt kích thước chính xác trong báo cáo và thay đổi thuộc tính "Sizing" trên hình ảnh thành "FitProportional".

+0

Thnx rất nhiều, t đã giúp tôi rất nhiều! – Martijn

+7

Tôi chỉ muốn làm rõ rằng nguồn hình ảnh phải được đặt thành ** Cơ sở dữ liệu **. Tôi không thể làm cho giải pháp này hoạt động cho đến khi tôi đặt thuộc tính Nguồn thành giá trị chính xác. Một chi tiết nhỏ có thể bị bỏ qua nếu bạn không chú ý. –

+0

@Adrian: Tôi đã cùng một vấn đề, tôi chưa đọc như bạn đã mô tả ở đây, nhưng điều đó không hiệu quả đối với tôi, vui lòng kiểm tra câu hỏi của tôi [ở đây] (http://stackoverflow.com/questions/42020490/base64-image-doesnt- hiển thị-trên-render-pdf-từ-rdlc-report) –

Các vấn đề liên quan