Iori的工具箱 之 C# 實現多個圖片合為一個Tiff

mybwu_com發表於2014-04-11

功能:


合併多個圖片為一個TIFF檔案
效果圖:


第二頁


第三頁



功能函式實現:

     public bool SaveMultipage(Image[] bmp, string location, string type)
        {
            if (bmp != null)
            {
                try
                {
                    File.Delete(location);
                    
                    var codecInfo = getCodecForstring(type);

                    if (bmp.Length == 1)
                    {
                        var iparams = new EncoderParameters(1);
                        var iparam = Encoder.Compression;
                        var iparamPara = new EncoderParameter(iparam, (long)(EncoderValue.CompressionNone));

                        iparams.Param[0] = iparamPara;
                        bmp[0].Save(location, codecInfo, iparams);
                    }
                    else if (bmp.Length > 1)
                    {
                        // Save the first page (frame).
                        var encoderParam1 = new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.MultiFrame);
                        var encoderParam2 = new EncoderParameter(Encoder.Compression,
                                                                 (long) EncoderValue.CompressionNone);

                        var encoderParams = new EncoderParameters(2);
                        encoderParams.Param[0] = encoderParam1;
                        encoderParams.Param[1] = encoderParam2;

                        bmp[0].Save(location, codecInfo, encoderParams);

                        for (int i = 1; i < bmp.Length; i++)
                        {
                            if (bmp[i] == null)
                                break;

                            encoderParams.Param[0] = encoderParam1;
                            encoderParams.Param[1] = new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.FrameDimensionPage);
                            bmp[0].SaveAdd(bmp[i], encoderParams);
                        }

                        encoderParams.Param[0] = new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.Flush);
                        bmp[0].SaveAdd(encoderParams);
                    }
                    return true;
                }
                catch (Exception ee)
                {
                    throw new Exception(ee.Message + "  Error in saving as multipage ");
                }
            }

            return false;
        }

        private ImageCodecInfo getCodecForstring(string type)
        {
            var info = ImageCodecInfo.GetImageEncoders();

            return (info.Select(t => new {t, enumName = type})
                        .Where(@t1 => @t1.t.FormatDescription.Equals(@t1.enumName))
                        .Select(@t1 => @t1.t))
                .FirstOrDefault();
        }


程式碼說明:引數:圖片陣列,儲存檔案的位置,儲存型別


單元測試程式碼實現:

  [TestMethod]
        public void Multiple_Image_Into_1Tiff_With_MultiplePages()
        {
            const string multipleImgPath = "C:\\Users\\Public\\Pictures\\Sample Pictures";
            var files = new DirectoryInfo(multipleImgPath).GetFiles("*.jpg", SearchOption.TopDirectoryOnly);
            Assert.IsTrue(files.Length > 1);
            var imgs = files.Select(f => Image.FromFile(f.FullName));
            SaveMultipage(imgs.ToArray(), "C:\\multiplePageTiff.tiff", "TIFF");

            const string singleImgPath = @"C:\Users\{your_pc_name}\Pictures\SingleImg";
            files = new DirectoryInfo(singleImgPath).GetFiles("*.jpg", SearchOption.TopDirectoryOnly);
            Assert.IsTrue(files.Length == 1);

            imgs = files.Select(f => Image.FromFile(f.FullName));
            SaveMultipage(imgs.ToArray(), "C:\\multiplePageTiff_Single.tiff", "TIFF");
        }


程式碼說明:

1.測試多個圖片的轉化

2.測試單個突破的轉化


相關文章