2008-08-31 19 views
12

Bir akışa kaydettiğim dinamik olarak oluşturulmuş bir resmim var, böylece onu bir ReportViewer yüzeyinde görüntüleyebilirim.Bir PNG görüntüsünü (bellek akışı olarak) bir .NET ReportViewer rapor yüzeyine nasıl oluşturabilirim?

Ayar:

  • Windows İstemci uygulama (WebForms)
  • ilgili veri kaynağı bir özelliği olarak dinamik olarak oluşturulmuş bir akım (CustomImage) ile, bir nesne veri kaynağı
  • Report.EnableExternalImages = Gerçek
  • Image.Source = Veritabanı
  • Image.MIMEType = resim/png
  • Image.Value = = Fields! CustomI mage.Value

Bu çalışma değil, yalnızca rapor yüzeyinde boş bir resim simgesi göstererek herhangi bir hata bildirmiyor. Diğer tüm alanlar doğru şekilde görüntüleniyor.

Bu senaryoda çalışan bir kod örneği var mı?

cevap

26

Raporlarda değişen bir logoya sahip olmak için benzer bir şey yapıyorum ancak değeri aktarmak için rapor parametrelerini kullanıyorum. Görüntüler genel olarak verilerin bir parçası olsaydı bu genel yöntemin işe yaramayacağı konusunda hiçbir neden göremiyorum.

Esasen görüntüler iki alandan geçirilir. İlk alan MIME Type değeridir ve ikinci alan, görüntü içeriğini içeren Base64 kodlu bir dizidir.

Adım 1: Resminizi Base64 kodlamasına dönüştürün. Rapora resim ve MIME türü geçirin:

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

Adım 2 (Bizim kod her zaman kolay MIME türü yapmak için bu yönteme ImageFormat.Png geçer).

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

_reportViewer.LocalReport.SetParameters(reportParams); 

Adım 3:

  • MIMETYPE: " =Parameters!ReportLogoMimeType.Value "
  • Değer: " =System.Convert.FromBase64String(Parameters!ReportLogo.Value) "
  • raporunda şu (tırnaklar olmadan) görüntü üzerinde özelliklerini ayarlayabilirsiniz
  • UPDATE: Ger olarak Onlar bir görüntüde geçiyoruz rağmen ölçekli yemiş gibi Genellikle görüntüleri korkunç bakmak ve olacaktır: Ardo en Image Source genç oyuncular için 'Veritabanı'

Tuzak olarak ayarlanması gerekir, aşağıda diyor Hangi "doğru boyut" gibi görünüyor. Bunun nedeni raporların baskı (300 dpi), ekran (genellikle 72 veya 92 dpi) değil, işlenmesidir. Düzeltme, yaklaşık 3 kat fazla büyük bir resim göndermektir, raporda doğru boyutta ayarlanır ve "Sizing" özelliğini "FitProportional" olarak değiştirir.

+0

Çok fazla Thnx, bana çok yardımcı oldu! – Martijn

+7

Sadece görüntü kaynağının ** Veritabanı ** olarak ayarlanması gerektiğini açıklığa kavuşturmak istedim. Kaynak özelliğini doğru değere ayarlayana kadar bu çözümü işe yaratamıyorum. Dikkat etmezseniz kaçırılabilecek küçük bir detay. –

+0

@Adrian: Aynı sorun, burada açıkladığınız gibi ben de değilim, ama bu benim için işe yaramadı lütfen sorumu kontrol edin [burada] (http://stackoverflow.com/questions/42020490/base64-image-doesnt- ekran-on-işlemek-pdf-den-rdlc-raporun) –