2008-12-29 10 views
35

में कनवर्ट करें मैं बिटफैप्स की एक सरणी को टीआईएफएफ प्रारूप की एक नई नई छवि में कैसे परिवर्तित कर सकता हूं, इस बिट टिफ छवि में सभी बिटमैप्स को फ्रेम के रूप में जोड़ सकता हूं?बिटमैप्स को एक बहुपक्षीय टीआईएफएफ छवि में .NET 2.0

.NET 2.0 का उपयोग कर।

उत्तर

74

यह एक छवि वस्तु

Bitmap bitmap = (Bitmap)Image.FromFile(file); 

सहेजें टिफ के रूप में याद करने के लिए बिटमैप एक और छवि वस्तु

Image tiff = Image.FromStream(byteStream) 

में

MemoryStream byteStream = new MemoryStream(); 
bitmap.Save(byteStream, ImageFormat.Tiff); 

रखें Tiff में रख कर पहले बिटमैप के साथ शुरू एन्कोडर्स तैयार करें:

ImageCodecInfo encoderInfo = GetEncoderInfo("image/tiff"); 

EncoderParameters encoderParams = new EncoderParameters(2); 
EncoderParameter parameter = new EncoderParameter(
    Encoder.Compression, (long)EncoderValue.CompressionCCITT4); 
encoderParams.Param[0] = parameter; 
parameter = new EncoderParameter(Encoder.SaveFlag, 
    (long)EncoderValue.MultiFrame); 
encoderParams.Param[1] = parameter; 

सहेजें फाइल करने के लिए:

tiff.Save(sOutFilePath, encoderInfo, encoderParams); 

बाद के पृष्ठों के लिए, एनकोडर तैयार:

EncoderParameters EncoderParams = new EncoderParameters(2); 
EncoderParameter SaveEncodeParam = new EncoderParameter(
    Encoder.SaveFlag, 
    (long)EncoderValue.FrameDimensionPage); 
EncoderParameter CompressionEncodeParam = new EncoderParameter(
    Encoder.Compression, (long)EncoderValue.CompressionCCITT4); 
EncoderParams.Param[0] = CompressionEncodeParam; 
EncoderParams.Param[1] = SaveEncodeParam; 
tiff.SaveAdd(/* next image as tiff - do the same as above with memory */, EncoderParams); 

अंत में फ़ाइल फ्लश:

EncoderParameter SaveEncodeParam = new EncoderParameter(
    Encoder.SaveFlag, (long)EncoderValue.Flush); 
EncoderParams = new EncoderParameters(1); 
EncoderParams.Param[0] = SaveEncodeParam; 
tiff.SaveAdd(EncoderParams); 

कि मिलना चाहिए आप शुरू कर दिया।

+4

उत्कृष्ट उत्तर। यदि आप वर्णन करते हैं कि आप कैसे पहुंचे हैं (जहां आपने इसे परीक्षण और त्रुटि से नहीं सीखा), तो केवल अधिक पूर्ण हो सकता है क्योंकि एमएसडीएन दस्तावेज़ इसे समझने के लिए असंभव के बगल में बनाते हैं। –

+0

मैं क्या सोच रहा था छविफॉर्मैट का उपयोग है।मेमोरीस्ट्रीम की सेव विधि में टिफ - स्पष्ट रूप से "एन्कोडिंग" बाद में पूरी तरह से असंबंधित प्रक्रिया है - यानी स्मृति स्ट्रीम के बाइट्स को डंप करना जो छविफॉर्मैट का उपयोग करके सहेजा गया था। फ़ाइल में एक टीआईएफएफ फाइल नहीं बनायेगी, मुझे लगता है? –

+4

"GetEncoderInfo" फ़ंक्शन क्या है? –

3

नहीं माइक्रोसॉफ्ट के ट्रैक रिकॉर्ड के एक प्रशंसक किया जा रहा है जब यह निपटने की बात आती है और मानकीकृत स्वरूपों की फ़ाइलें बनाते समय, मैं MagickNet के रूप में ImageMagick, एक नेट पुस्तकालय के रूप में उपलब्ध उपयोग करने का सुझाव होगा (सावधान रहना, http://midimick.com/magicknet/ वर्तमान में एक स्पाइवेयर पॉपअप है , मैंने साइट के मालिक को सतर्क कर दिया है)।

19

Google पर थोड़ी सी खोज के बाद इस पोस्ट में आया। मैंने उस कोड को आजमाया जो पोस्ट में था 'a'b'''d'f'g'h'h', लेकिन यह मेरे लिए काम नहीं किया। शायद, मैं कुछ सही ढंग से नहीं कर रहा था।

किसी भी मामले में, मुझे एक और पोस्ट मिली जिसने छवियों को बहु पृष्ठ टिफ में सहेजा। यहां पोस्ट का लिंक दिया गया है: http://www.bobpowell.net/addframes.htm

इसके अलावा, यह कोड मेरे लिए काम किया गया है। यह उस पद के समान होना चाहिए।

Encoder encoder = Encoder.SaveFlag; 
ImageCodecInfo encoderInfo = ImageCodecInfo.GetImageEncoders().First(i => i.MimeType == "image/tiff"; 
EncoderParameters encoderParameters = new EncoderParameters(1); 
encoderParameters.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.MultiFrame); 

// Save the first frame of the multi page tiff 
Bitmap firstImage = (Bitmap) _scannedPages[0].RawContent; 
firstImage.Save(fileName, encoderInfo, encoderParameters); 

encoderParameters.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.FrameDimensionPage); 

// Add the remining images to the tiff 
for (int i = 1; i < _scannedPages.Count; i++) 
{ 
    Bitmap img = (Bitmap) _scannedPages[i].RawContent; 
    firstImage.SaveAdd(img, encoderParameters); 
} 

// Close out the file 
encoderParameters.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.Flush); 
firstImage.SaveAdd(encoderParameters); 
+1

खोना नहीं किया! – Pisu

2

यहां बहु-टिफ़ फ़ाइल का विभाजन ऑपरेशन है। यह स्ट्रिंग सबस्ट्रिंग फ़ंक्शन की तरह काम करता है। छवि का पहला सूचकांक आपका मास्टरबिटमैप होगा और आप इंडेक्स के अंत तक मास्टरबिटमैप में फ्रेम जोड़ना जारी रखेंगे।

public void SaveMultiFrameTiff(int start, int end) 
    {    
     string outputFileName = "out.TIF"; 
     string inputFileName = "input.TIF";    

     try 
     {     

      Bitmap MasterBitmap = new Bitmap(inputFileName); //Start page of document(master) 
      Image imageAdd = Image.FromFile(inputFileName); //Frame Image that will be added to the master   
      Guid guid = imageAdd.FrameDimensionsList[0]; //GUID 
      FrameDimension dimension = new FrameDimension(guid); 
      // start index cannot be less than 0 and cannot be greater than frame count   
      if (start < 1 || end > MasterBitmap.GetFrameCount(dimension)) { return; }   

      EncoderParameters ep = new EncoderParameters(1); 

      //Get Image Codec Information 
      ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders(); 
      ImageCodecInfo codecInfo = codecs[3]; //image/tiff 

      //MultiFrame Encoding format 
      EncoderParameter epMultiFrame = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.MultiFrame); 
      ep.Param[0] = epMultiFrame; 
      MasterBitmap.SelectActiveFrame(dimension, start - 1); 
      MasterBitmap.Save(outputFileName, codecInfo, ep);//create master document 

      //FrameDimensionPage Encoding format 
      EncoderParameter epFrameDimensionPage = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.FrameDimensionPage); 
      ep.Param[0] = epFrameDimensionPage; 

      for (int i = start; i < end; i++) 
      { 
       imageAdd.SelectActiveFrame(dimension, i);//select next frame 
       MasterBitmap.SaveAdd(new Bitmap(imageAdd), ep);//add it to the master 
      } 

      //Flush Encoding format 
      EncoderParameter epFlush = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.Flush); 
      ep.Param[0] = epFlush; 
      MasterBitmap.SaveAdd(ep); //flush the file     
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 
} 
4

सहायक विषय। जानकारी के लिए धन्यवाद। मुझे बेस 64 एन्कोडेड स्ट्रिंग्स की सरणी से एक मल्टीपाज छवि सिलाई करने की आवश्यकता थी। इस थ्रेड में जानकारी के आधार पर मैंने यह एक साथ रखा है। मुझे काफी समझ में नहीं आ रहा है कि मुझे स्पष्ट रूप से निर्दिष्ट छवि प्रारूप के साथ मेमोरी स्ट्रीम क्यों बनाना है, लेकिन यह काम खत्म हो गया है, अगर इससे निपटने का बेहतर तरीका है तो कृपया मुझे बताएं। धन्यवाद

/// <summary> 
    /// Takes in an array of base64 encoded strings and creates a multipage tiff. 
    /// </summary> 
    /// <param name="sOutFile">file to be generated</param> 
    /// <param name="pagesbase64Array"></param> 
    private void SaevAsMultiPageTiff(string sOutFile, string[] pagesbase64Array) 
    { 
     System.Drawing.Imaging.Encoder encoder = System.Drawing.Imaging.Encoder.SaveFlag; 
     ImageCodecInfo encoderInfo = ImageCodecInfo.GetImageEncoders().First(i => i.MimeType == "image/tiff"); 
     EncoderParameters encoderParameters = new EncoderParameters(1); 
     encoderParameters.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.MultiFrame); 

     Bitmap firstImage = null; 
     try 
     { 

      using (MemoryStream ms1 = new MemoryStream()) 
      { 
       using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(pagesbase64Array[0]))) 
       { 
        Image.FromStream(ms).Save(ms1, ImageFormat.Tiff); 
        firstImage = (Bitmap)Image.FromStream(ms1); 
       } 
       // Save the first frame of the multi page tiff 
       firstImage.Save(sOutFile, encoderInfo, encoderParameters); //throws Generic GDI+ error if the memory streams are not open when this is called 
      } 


      encoderParameters.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.FrameDimensionPage); 

      Bitmap imagePage; 
      // Add the remining images to the tiff 
      for (int i = 1; i < pagesbase64Array.Length; i++) 
      { 

       using (MemoryStream ms1 = new MemoryStream()) 
       { 
        using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(pagesbase64Array[i]))) 
        { 
         Image.FromStream(ms).Save(ms1, ImageFormat.Tiff); 
         imagePage = (Bitmap)Image.FromStream(ms1); 
        } 

        firstImage.SaveAdd(imagePage, encoderParameters); //throws Generic GDI+ error if the memory streams are not open when this is called 
       } 
      } 

     } 
     catch (Exception) 
     { 
      //ensure the errors are not missed while allowing for flush in finally block so files dont get locked up. 
      throw; 
     } 
     finally 
     { 
      // Close out the file 
      encoderParameters.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.Flush); 
      firstImage.SaveAdd(encoderParameters); 
     } 
    } 
संबंधित मुद्दे