C#と8bit grayscale TIFFの読み込み

Windows

C#とLibTiff.Netを使って8bitグレースケールsingle TIFFを読み込みます。
基本的に以前に作成したCのプログラムと同じ内容です。
WindowsとLinuxの両方でコンパイル出来ます。

環境・コンパイルなど

「C#とlibtiff.netの環境構築」の記事を参照。

ソース

「8bit.tif」は、自前で準備するか、以前の記事のソースを使って作成する。

using System;
using System.Diagnostics;
using BitMiracle.LibTiff.Classic;

//namespace LibTiffSamples
//{
    public static class Read8BitTiff
    {
        // main
        static void Main(string[] args)
        {
            Console.WriteLine("Read 8bit Tiff file.");

            // 方法1 static
//          readTiff.readTiffFile();

            // 方法2
            readTiff t = new readTiff();
            t.readTiffFile();
        }
    } // end of Read8BitTiff class
//} // end of namespace

    public class readTiff
    {
        // read TIFF
//      public static void readTiffFile() // 方法1
        public void readTiffFile() // 方法2
        {
            int    i, j, width, height;
            ushort samplesperpixel, bitspersample;
            double resolution_x, resolution_y;
            string fileName = "8bit.tif";

            using (Tiff tif = Tiff.Open(fileName, "r"))
            {
                if (tif == null)
                {
                    Console.WriteLine("Can not read Tiff file.");
                    return;
                }

                width           = tif.GetField(TiffTag.IMAGEWIDTH)[0].ToInt();
                height          = tif.GetField(TiffTag.IMAGELENGTH)[0].ToInt();
                resolution_x    = tif.GetField(TiffTag.XRESOLUTION)[0].ToDouble();
                resolution_y    = tif.GetField(TiffTag.YRESOLUTION)[0].ToDouble();
                bitspersample   = tif.GetField(TiffTag.BITSPERSAMPLE)[0].ToUShort();
                samplesperpixel = tif.GetField(TiffTag.SAMPLESPERPIXEL)[0].ToUShort();

                Console.WriteLine( width );
                Console.WriteLine( height );
                Console.WriteLine( resolution_x );
                Console.WriteLine( resolution_y );
                Console.WriteLine( bitspersample );
                Console.WriteLine( samplesperpixel );

                // 画像データの確保
                byte[] image = new byte[width * height];

                // 1ラインのデータ配列
                byte[] scanline = new byte[height * width];
                // 読み取ったデータを格納
                for( i = 0; i < height; i++ )
                {
                    tif.ReadScanline(scanline, i);
                    for( j = 0; j < width; j++ )
                    {
                        image[width * i + j] = scanline[j];
                     // Console.WriteLine( scanline[j] );
                    }
                }

                // 確認
                using (Tiff output = Tiff.Open("8bit-confirm.tif", "w"))
                {
                    if (output == null)
                    {
                        Console.WriteLine("Can not create Tiff file.");
                        return;
                    }

                    output.SetField(TiffTag.IMAGEWIDTH, width);
                    output.SetField(TiffTag.IMAGELENGTH, height);
                    output.SetField(TiffTag.SAMPLESPERPIXEL, samplesperpixel);
                    output.SetField(TiffTag.BITSPERSAMPLE, bitspersample);
                    output.SetField(TiffTag.ORIENTATION, Orientation.TOPLEFT);
//                  output.SetField(TiffTag.ROWSPERSTRIP, height);
                    output.SetField(TiffTag.XRESOLUTION, resolution_x);
                    output.SetField(TiffTag.YRESOLUTION, resolution_y);
                    output.SetField(TiffTag.RESOLUTIONUNIT, ResUnit.INCH);
                    output.SetField(TiffTag.PLANARCONFIG, PlanarConfig.CONTIG);
                    output.SetField(TiffTag.PHOTOMETRIC, Photometric.MINISBLACK);
                    output.SetField(TiffTag.COMPRESSION, Compression.NONE);
                    output.SetField(TiffTag.FILLORDER, FillOrder.MSB2LSB);

                    // まとめて書き込み
                    byte[] buf = new byte[image.Length * sizeof(byte)];
                    Buffer.BlockCopy(image, 0, buf, 0, buf.Length);
                    output.WriteEncodedStrip(0, buf, buf.Length);
                }

            }
            // 画像表示
            //System.Diagnostics.Process.Start(fileName);
        }
    }
//} // end of namespace



created by Rinker
¥3,630 (2024/07/02 05:22:54時点 楽天市場調べ-詳細)

Comments