【C#】.NET で libtiff を使う ~ LibTiff.Net ~

■ はじめに

 * libgeotiffを使う手始めとして、まずは、libtiff を使ってみる

.NET で libtiff を使うには...

 * 「LibTiff.Net」を使用する

LibTiff.Net

公式サイト
https://bitmiracle.com/libtiff/
サンプル
https://github.com/BitMiracle/libtiff.net/tree/master/Samples
ライセンス
 * New BSD license
設定
 * NuGet で「BitMiracle.LibTiff.NET」をインストールする

■ サンプル

 * 公式サイト内の「ReadSamples」をみて、サンプルを作成してみた(簡単!)
https://github.com/BitMiracle/libtiff.net/blob/master/Samples/ReadSamples/C%23/ReadSamples.cs
 * サンプル画像は、これまた公式サイト内にあるので、それを利用させてもらった
https://github.com/BitMiracle/libtiff.net/tree/master/Samples/Sample%20Data

Form1.cs

using BitMiracle.LibTiff.Classic;
using System;
using System.Drawing;
using System.Windows.Forms;

namespace SampleForm
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      // Open the TIFF image(TIFF画像を開く)
      using (Tiff tiffImage = Tiff.Open(@"C:\temp\dscf0013.tif", "r"))
      {
        if (tiffImage == null)
        {
          MessageBox.Show("Could not open incoming image");
          return;
        }

        // Find the width and height of the image(画像の幅と高さを取得)
        FieldValue[] value = tiffImage.GetField(TiffTag.IMAGEWIDTH);
        int width = value[0].ToInt();

        value = tiffImage.GetField(TiffTag.IMAGELENGTH);
        int height = value[0].ToInt();

        int imageSize = height * width;
        int[] raster = new int[imageSize];

        // Read the image into the memory buffer()
        if (!tiffImage.ReadRGBAImage(width, height, raster))
        {
          MessageBox.Show("Could not read image");
          return;
        }

        Bitmap bitmap = new Bitmap(width, height);
        for (int x = 0; x < bitmap.Width; ++x)
        {
          for (int y = 0; y < bitmap.Height; ++y)
          {
            bitmap.SetPixel(x, y, GetPixcel(x, y, raster, width, height));
          }
        }

        if (this.pictureBox1.Image != null)
        {
          this.pictureBox1.Image.Dispose();
        }

        this.pictureBox1.Image = bitmap;
      }
    }

    private static Color GetPixcel(int x, int y, int[] raster, int width, int height)
    {
      int offset = (height - y - 1) * width + x;
      int red = Tiff.GetR(raster[offset]);
      int green = Tiff.GetG(raster[offset]);
      int blue = Tiff.GetB(raster[offset]);
      return Color.FromArgb(red, green, blue);
    }
  }
}