私はTIFFとLibTiff.Netを初めて使っています。タイルしたTIFFファイルを読み込んで、別のTIFFファイルに書きたいと思います。どうすればこれを達成できますか? また、Tiffファイルの素材は非常に役に立ちます。 ありがとうございます。LibTiff.Netを使用してTIFF画像からすべてのタイルを読み取る方法は?
0
A
答えて
0
このコードは、tiffイメージ内のタイルを繰り返し、次にタイルの行を繰り返します。結果のデータはdata
バイト配列に格納されます。これからbitmapsource
を作成できます。以下のコードは、16bit、8bit、1bitの灰色のタイルtiff画像で動作します。
_tiff = Tiff.Open(filepath, "r");
var data = new byte[header.ImageWidth * header.ImageHeight];
var buffer = new byte[_tiff.TileSize()];
for (var row = 0; row < header.ImageHeight; row += header.TileHeight)
{
for (var col = 0; col < header.ImageWidth; col += header.TileWidth)
{
// Read the tile
if (_tiff.ReadTile(buffer, 0, col, row, 0, 0) < 0)
{
throw new Exception("Error reading data");
}
var index = 0;
// Iterate the rows in the tile
for (var i = 0; i < header.TileHeight && i + row < header.ImageHeight; i++)
{
var length = header.TileWidth;
// Index of the first position in the row
var position = (row + i) * data.Width + col;
// Check we are not outside the image
if (col + length > header.ImageWidth)
{
length = header.ImageWidth - col;
}
switch (header.BitsPerPixel)
{
case 1:
{
for (var p = 0; p < (length + 7)/8; p++)
{
// Unpack the pixels
for (var b = 0; b < 8; b++)
{
data[position + p * 8 + (7 - b)] = (buffer[index/8 + p] & (1 << b)) != 0 ? byte.MaxValue : byte.MinValue;
}
}
break;
}
case 8:
{
for (var p = 0; p < length; p++)
{
data[position + p] = buffer[index + p];
}
break;
}
case 16:
{
for (var p = 0; p < length; p++)
{
data[position + p] = buffer[index * 2 + p * 2];
}
break;
}
default:
{
throw new NotImplementedException();
}
}
index += header.TileWidth;
}
}
}
あなたはこのようTIFFヘッダを読むことができます:
public class TaggedImageHeader
{
public int BitsPerPixel { get; private set; }
public int Components { get; private set; }
public string Compression { get; private set; }
public int ImageHeight { get; private set; }
public int ImageWidth { get; private set; }
public string PlanarConfig { get; private set; }
public int TileHeight { get; private set; }
public int TileWidth { get; private set; }
internal static TaggedImageHeader Read(Tiff tiff)
{
var imageWidth = tiff.GetField(TiffTag.IMAGEWIDTH);
var imageHeight = tiff.GetField(TiffTag.IMAGELENGTH);
var bitsPerPixel = tiff.GetField(TiffTag.BITSPERSAMPLE);
var components = tiff.GetField(TiffTag.SAMPLESPERPIXEL);
var tileWidth = tiff.GetField(TiffTag.TILEWIDTH);
var tileHeight = tiff.GetField(TiffTag.TILELENGTH);
var compression = tiff.GetField(TiffTag.COMPRESSION);
var planarConfig = tiff.GetField(TiffTag.PLANARCONFIG);
return new TaggedImageHeader
{
ImageWidth = imageWidth?[0].ToInt() ?? 0,
ImageHeight = imageHeight?[0].ToInt() ?? 0,
BitsPerPixel = bitsPerPixel?[0].ToInt() ?? 0,
Components = components?[0].ToInt() ?? 0,
TileWidth = tileWidth?[0].ToInt() ?? 0,
TileHeight = tileHeight?[0].ToInt() ?? 0,
Compression = compression?[0].ToString() ?? "",
PlanarConfig = planarConfig?[0].ToString() ?? ""
};
}
}
はあなたがヘッダを読む前にTIFFファイルのようなピラミッドを扱う場合は、_tiff.SetFrame(frame)
を呼び出していることを確認します。
データ配列を以下のコードに置き換えて、WriteableBitmap
バックバッファに直接書き込むことができます。これにより不要なコピーが削除されます。
var data = new UnsafeBuffer((byte*)bitmap.BackBuffer, bitmap.BackBufferStride, bitmap.PixelHeight);
UnsafeBuffer:
public unsafe class UnsafeBuffer : Buffer
{
private readonly byte* _data;
public UnsafeBuffer(byte* data, int x, int y) : base(x, y)
{
_data = data;
}
public override byte this[int x, int y]
{
get => this[y * Width + x];
set => this[y * Width + x] = value;
}
public override byte this[int index]
{
get => _data[index];
set => _data[index] = value;
}
}
public abstract class Buffer
{
protected Buffer(int width, int height)
{
Width = width;
Height = height;
}
public int Height { get; private set; }
public int Length => Width * Height;
public int Width { get; private set; }
public abstract byte this[int x, int y] { get; set; }
public abstract byte this[int index] { get; set; }
}
有用なリソースは、その中にサンプルを有するdocumentationあろう。私もこれを見つけたのはlinkです。
関連する問題
- 1. Libtiff.Netを使用して32ビットのグレースケールTiffを読み取る
- 2. libtiff.netを使用してTIFF画像からフレームを削除します。
- 3. Haskellを使用して画像からピクセルを読み取る
- 4. javascriptを使用して画像からバーコードを読み取る
- 5. LibTiff.Netを使用して1.5 GBタイルベースのTiffファイルを読み取る際のメモリ不足例外
- 6. LibTiff.Net 2.3ライブラリを使用してtiffタグを削除する方法
- 7. LibTiff.netを使用してTIFFファイルをトリミングするときの画像の色を変更する
- 8. データリーダーを使用してテンソルフローのtiffファイルを読み取る正しい方法
- 9. LibTIFF.NETタイル化されたOJPEGを単一のタイル画像に変換する
- 10. itkを使用してHDF5形式で画像を読み取る方法は?
- 11. グライドライブラリを使用して画像で画像を読み込む方法は?
- 12. javaを使用して画像からバーコードを読み取るには?
- 13. keras.preprocessingを使用してGoogle Cloud Storageから画像を読み込む方法
- 14. Poco C++を使用してHTTPサーバーの応答から画像コンテンツを読み取る方法は?
- 15. LibTiff.netを使ってTiffを作成する
- 16. matlabを使用して画像からDPIデータを読み取る
- 17. QtConcurrentを使用してQImageReaderで画像ファイルを読み取る
- 18. JavaでFileInputStreamを使用して画像を読み取る
- 19. OpenXMLSDKとC#を使用してExcelシートから画像を読み取る方法は?
- 20. C#を使用してデータベースから画像を読み込む?
- 21. datainputstreamを使用してソケットから読み取る方法
- 22. Cを使用してマイクから読み取る方法
- 23. zxingライブラリを使用して1つの画像から複数のqrコードを読み取る方法
- 24. Piccaso画像読み込みライブラリを使用して画像をスムーズにする方法は?
- 25. 3D TIFF画像からパーツを抽出する方法は?
- 26. TIFFヘッダーファイルの読み取り方法c#?
- 27. System.Drawingを使用してマルチページTIFF画像を編集する
- 28. レスポンスを使用してブラウザにTIFF画像を表示する
- 29. DelphiでIndy Clientを使用しているサーバーからすべてのバイトを読み取る方法は?
- 30. Javaを使用してjsoupから画像のURLを解読する方法