2011-05-19 56 views
5

पर टीआईएफएफ (बाइट [] के रूप में) को प्रदर्शित करने के लिए कैसे मैंने अपनी सभी टीआईएफएफ फ़ाइलों को डेटाबेस में रखने के लिए एक विंडो सेवा बनाई और उन्हें Byte[] के रूप में संग्रहीत किया।सिल्वरलाइट छवि नियंत्रण

अब मैं Silverlight छवि नियंत्रण

तो मैं क्रम में XAML बाइंडिंग दौरान कनवर्टर का उपयोग करने के लिए BitmapByte[] कन्वर्ट करने के लिए क्योंकि Image.Source केवल eitheir यूआरआई स्वीकार माध्यम से उन्हें प्रदर्शित करने के लिए सक्षम होना चाहते हैं (मेरे पास नहीं है सर्वर पर संग्रहीत फ़ाइल इस विधि का उपयोग नहीं कर सकती है) या Bitmap

BitmapImage bmi = new BitmapImage(); 
if (value != null) 
{ 
    ImageGallery imageGallery = value as ImageGallery; 
    byte[] imageContent = imageGallery.ImageContent; 
    string imageType = imageGallery.ImageType; 
    using (MemoryStream ms = new MemoryStream(imageContent)) 
    { 
     bmi.SetSource(ms); 
    } 
} 
return bmi; 

हालांकि, मैं bmi.SetSource(ms) पर अपवाद मिलता है क्योंकि सिल्वरलाइट केवल JPEG और PNG छवियाँ समर्थन करता है।

इसलिए मैंने और अधिक शोध किया और मुझे पता था कि मुझे टीआईएफएफ के बाइट्स को जेपीईजी या पीएनजी के बाइट्स में परिवर्तित करना चाहिए, फिर यह काम करेगा।

  • सर्वर पर रूपांतरण करने से:

    है कि मैं दो तरीकों की कोशिश की करने के लिए मेरी रिया सेवा कॉल में, ImageGallery पुन: प्राप्त करने के बाद, मैं उपलब्ध छवि के माध्यम से लूप बाइट्स TIFF के बाइट्स कन्वर्ट करने के लिए जेपीईजी का।

लेकिन यह काम नहीं करता है .... क्या आप मुझे बता सकते हैं कि मैंने गलत कहां किया?

public IQueryable<ImageGallery> GetImageGalleries() 
{ 
    var imageGalleries = this.ObjectContext.ImageGalleries.OrderBy(i=>i.ImageName); 
    foreach (ImageGallery imageGallery in imageGalleries) 
    { 
     if (imageGallery.ImageType == ".tif" || imageGallery.ImageType == ".tiff") 
     { 
      //Convert the Tiff byte array format into JPEG stream format 
      System.Drawing.Bitmap dImg = new System.Drawing.Bitmap(new MemoryStream(imageGallery.ImageContent)); 
      MemoryStream ms = new MemoryStream(); 
      dImg.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); 

      //then convert the JPEG stream format into JPEG byte array format 
      byte[] buf = new byte[ms.Length]; 
      ms.Read(buf, 0, buf.Length); 

      //Changing the format tiff byte[] of ImageGallery to jpeg byte[] 
      imageGallery.ImageContent = buf; 
     } 
    } 
    return imageGalleries; 
} 
  • अन्य समाधान LibTiff.Net पुस्तकालय का उपयोग करने के सिल्वरलाइट पर सीधे WritableBitmap को TIFF की Byte[] सीधे परिवर्तित करने के लिए है।

हालांकि, उनके नमूना आवेदन के माध्यम से खुदाई या परावर्तक का उपयोग कर स्रोत कोड कार्यों को देखने के लिए के बाद, मैं अभी भी समझ नहीं कैसे अपने पुस्तकालय का उपयोग करने के WritableBitmap जेपीईजी (या PNG) को TIFF के बाइट्स कन्वर्ट करने के लिए है क्योंकि उनका नमूना केवल फ़ाइल निर्देशिका में टीआईएफएफ की खोज का उपयोग करने के लिए एपीआई दिखाता है। मेरे मामले में, मेरे पास सर्वर पर एक मौजूदा फ़ाइल नहीं है।

कोई मेरी मदद कर सकता है कि सिल्वरलाइट के छवि नियंत्रण पर टीआईएफएफ फ़ाइल कैसे दिखाना है?

मैंने मंच की खोज की लेकिन इसके लिए कोई ठोस जवाब नहीं मिला।

धन्यवाद

उत्तर

2

मुझे लगता है कि लिबटीफ जाने का रास्ता होगा। Ulitmately Tiff.ClientData एक Stream स्वीकार करता है जो टिफ डेटा है। यदि आपका टिफ़ डेटा वास्तव में byte[] है तो आपको इसके आस-पास MemoryStream की आवश्यकता है। किसी बिंदु पर अधिक संभावना byte[] को स्ट्रीम से खींचा जाता है ताकि आपको शायद इस इंटरमीडिएटर byte[]/MemoryStream की आवश्यकता न हो।

2
  1. संदर्भ लिबटीफ।शुद्ध

  2. इस वर्ग जोड़ें:

    using System; 
    using System.Collections.Generic; 
    using System.IO; 
    using System.Windows.Media.Imaging; 
    using BitMiracle.LibTiff.Classic; 
    
    namespace CoreTechs.X9 
    { 
        public static class TiffUtility 
        { 
         public static Tiff CreateTiff(this byte[] bytes) 
         { 
          MemoryStream ms = new MemoryStream(bytes); 
          Tiff tiff = Tiff.ClientOpen("in-memory", "r", ms, new TiffStream()); 
          return tiff; 
         } 
    
         public static IEnumerable<WriteableBitmap> ConvertToWriteableBitmaps(this Tiff tiff) 
         { 
          if (tiff == null) 
           throw new ArgumentNullException("tiff", "tiff is null."); 
    
          short dirs = tiff.NumberOfDirectories(); 
    
          for (int i = 0; i < dirs; i++) 
          { 
           if (tiff.SetDirectory((short)i)) 
           { 
            int tileCount = tiff.NumberOfTiles(); 
            int stripCount = tiff.NumberOfStrips(); 
    
            var frameWidthField = tiff.GetField(TiffTag.IMAGEWIDTH); 
            var frameHeightField = tiff.GetField(TiffTag.IMAGELENGTH); 
            var compressionField = tiff.GetField(TiffTag.COMPRESSION); 
            var xResolutionField = tiff.GetField(TiffTag.XRESOLUTION); 
            var yResolutionField = tiff.GetField(TiffTag.YRESOLUTION); 
            var samplesPerPixelField = tiff.GetField(TiffTag.SAMPLESPERPIXEL); 
    
            int frameWidth = frameWidthField != null && frameWidthField.Length > 0 ? frameWidthField[0].ToInt() : 0; 
            int frameHeight = frameHeightField != null && frameHeightField.Length > 0 ? frameHeightField[0].ToInt() : 0; 
            var compression = compressionField != null && compressionField.Length > 0 ? (Compression)compressionField[0].Value : Compression.NONE; 
            var xResolution = xResolutionField != null && xResolutionField.Length > 0 ? new double?(xResolutionField[0].ToDouble()) : null; 
            var yResolution = yResolutionField != null && yResolutionField.Length > 0 ? new double?(yResolutionField[0].ToDouble()) : null; 
            var samplesPerPixel = samplesPerPixelField != null && samplesPerPixelField.Length > 0 ? samplesPerPixelField[0].ToString() : String.Empty; 
    
            if (xResolution != null && yResolution == null) 
            { 
             yResolution = xResolution; 
            } 
    
            var buffer = new int[frameWidth * frameHeight]; 
            tiff.ReadRGBAImage(frameWidth, frameHeight, buffer); 
    
            var bmp = new WriteableBitmap(frameWidth, frameHeight); 
            for (int y = 0; y < frameHeight; y++) 
            { 
             var ytif = y * frameWidth; 
             var ybmp = (frameHeight - y - 1) * frameWidth; 
    
             for (int x = 0; x < frameWidth; x++) 
             { 
              var currentValue = buffer[ytif + x]; 
    
              // Shift the Tiff's RGBA format to the Silverlight WriteableBitmap's ARGB format 
              bmp.Pixels[ybmp + x] = Tiff.GetB(currentValue) | Tiff.GetG(currentValue) << 8 | Tiff.GetR(currentValue) << 16 | Tiff.GetA(currentValue) << 24; 
             } 
            } 
    
            yield return bmp; 
           } 
          } 
         } 
        } 
    } 
    
  3. इस तरह exension विधियों का उपयोग करें:

    byte[] myHappyTiffData = GetMyTiffBytesFromSomewhere(); 
    WriteableBitmap bmp = myHappyTiffData.CreateTiff().ConvertToWriteableBitmaps().FirstOrDefault(); 
    myImageControl.Source = bmp; 
    
1

हम अपने मीडिया मैनेजर के लिए एक समाधान के रूप LibTiff साथ शुरू हुआ। मैं इसकी सिफारिश नहीं करता।

जैसा कि आप देख सकते हैं कि यह प्रत्येक पृष्ठ के लिए एक लिखने योग्य बिटमैप बनाता है। डब्लूबीबी सबसे अधिक प्रदर्शन बाधा है, जो आप सिल्वरलाइट में उपयोग कर सकते हैं, लीकिंग ऑब्जेक्ट है, इसलिए यदि आपको अधिक मिला तो 1 सिंगल पेज टिफ हो जाए तो आपका ऐप मेमोरी से तेज़ी से खत्म हो जाएगा, तो आप अवदा केदवरा कह सकते हैं।

ऐसे दर्शक हैं जो एक सभ्य लाइसेंस शुल्क के लिए आपके ऐप (और ब्राउज़र और कंप्यूटर) को मारने के बिना स्पष्ट रूप से एक बड़ा मल्टीपाज टिफ़ लोड कर सकते हैं, लेकिन इस बिंदु पर मुझे कुछ भी नहीं मिला जो आपको पृष्ठों को निकालने के लिए एक टिफ को डीकोड करने की अनुमति देता है ।

धावक अप:

संबंधित मुद्दे