2

複数の.tifファイルを 1 つに結合しようとしていますが、結合後の新しい.tifファイルの画質が非常に低くなります。

そのクオリティを上げるには?

新しいマージされたファイルの品質を元の品質と同じにしたい。このコードを使用して tif ファイルをマージしています

   string[] sa = path;
        ImageCodecInfo info = null;
        foreach (ImageCodecInfo ice in ImageCodecInfo.GetImageEncoders())
            if (ice.MimeType == "image/tiff")
                info = ice;
        Encoder enc = Encoder.SaveFlag;
        EncoderParameters ep = new EncoderParameters(1);
        ep.Param[0] = new EncoderParameter(enc, (long)EncoderValue.MultiFrame);
        Bitmap pages = null;
        int frame = 0;
        foreach (string s in sa)
        {
            //  using (FileStream fileStream = System.IO.File.Open(s, FileMode.Open))
            {
                if (frame == 0)
                {
                    pages = (Bitmap)Image.FromFile(s);
                    //save the first frame
                    pages.Save(filepath, info, ep);
                }
                else
                {
                    //save the intermediate frames
                    ep.Param[0] = new EncoderParameter(enc, (long)EncoderValue.FrameDimensionPage);
                    Bitmap bm = (Bitmap)Image.FromFile(s);
                    pages.SaveAdd(bm, ep);
                }
                if (frame == sa.Length - 1)
                {
                    //flush and close.
                    ep.Param[0] = new EncoderParameter(enc, (long)EncoderValue.Flush);
                    pages.SaveAdd(ep);
                }
                frame++;
            }
        }
4

1 に答える 1

0

これについて 100% 確信があるわけではありませんが、マルチフレーム TIFF はデフォルトで G3 を使用してエンコードされていると思います。試してみるものを与えるだけで、これを変更します:

Encoder enc = Encoder.SaveFlag;
EncoderParameters ep = new EncoderParameters(1);
ep.Param[0] = new EncoderParameter(enc, (long)EncoderValue.MultiFrame);

これに:

Encoder enc = Encoder.SaveFlag;
Encoder encComp = Encoder.Encoder.Compression;
EncoderParameters ep = new EncoderParameters(2);
ep.Param[0] = new EncoderParameter(enc, (long)EncoderValue.MultiFrame);
ep.Param[1] = new EncoderParameter(encComp, (long)EncoderValue.CompressionLZW);

もう一度やり直してください (CompressionNoneの代わりに使用することもできますがCompressionLZW、LZW はロスレスであるため、品質が低下することはありません)。

于 2015-01-08T13:15:54.617 に答える