저는 TIFF와 LibTiff.Net을 처음 접했습니다. 타일로 된 TIFF 파일을 읽고 다른 TIFF 파일에 쓰고 싶습니다. 이것을 어떻게 할 수 있습니까? Tiff 파일의 모든 자료도 큰 도움이됩니다. 미리 감사드립니다. LibTiff.Net을 사용하여 TIFF 이미지에서 모든 타일을 읽는 방법은 무엇입니까?
0
A
답변
0
이 코드는 tiff 이미지의 타일을 반복 한 다음 타일의 행을 반복합니다. 결과 데이터는 data
바이트 배열에 저장됩니다. 여기에서 bitmapsource
을 만들 수 있습니다. 아래 코드는 16 비트, 8 비트, 1 비트 회색 타일 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;
}
}
}
이 같은 티파니 헤더를 읽을 수 있습니다
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을 사용하여 TIFF 이미지에서 프레임 제거
- 2. LibTiff.Net을 사용하여 tif 이미지에서 tiff 태그 수를 얻는 가장 빠르고 가장 빠른 방법은 무엇입니까?
- 3. Libtiff.Net을 사용하여 32 비트 회색조 Tiff 읽기
- 4. Java로 타일로 TIFF 파일을 읽는 방법은 무엇입니까?
- 5. 원시 이미지에서 tiff 이미지
- 6. 유닉스에서 tessract를 사용하여 큰 tiff 이미지에서 텍스트를 추출하는 방법은 무엇입니까?
- 7. LibTiff.net을 사용하여 바둑판 식 배열 한 Tiff 만들기
- 8. LibTiff.net을 사용하여 tiff 파일을자를 때 이미지 색상 변경
- 9. iText를 사용하여 TIFF 이미지에서 PDF 작성
- 10. .tiff 이미지에서 ImageUniqueID 가져 오기
- 11. Tiff 이미지에서 설명/키워드를 가져올 수 있습니까?
- 12. TIFF 이미지에서 C#으로 세계 파일을 만드는 방법은 무엇입니까?
- 13. Libtiff를 사용하여 모든 tiff 페이지를 분할하십시오.
- 14. Libtiff.net에서 YCBCR 측광기를 사용하여 타일을 쓰지 못했습니다.
- 15. tiff 이미지에서 비트 맵 객체 만들기
- 16. Silverlight에서 LibTiff.Net을 사용하여 TIFF를 다시 꾸며보기
- 17. LibTiff.Net을 사용하여 맞춤 메타 데이터 태그 추가하기
- 18. RMagick을 사용하여 이미지의 일부분을 읽는 방법은 무엇입니까?
- 19. 효율적인 TIFF 타일 추출 C++
- 20. Matlab에서 tiff 형식으로 큰 이미지를 읽는 방법은 무엇입니까?
- 21. TIFF 리치 TIFF 형식의 변환 문제
- 22. 3D 티프 이미지에서 부품을 추출하는 방법은 무엇입니까?
- 23. 자바 스크립트를 사용하여 tiff 이미지에서 지리적 태그를 추출하는 방법이 있습니까?
- 24. visiff.LangeWidget을 사용하여 Tiff 이미지에서 rangeWidget을 사용할 수 있습니까?
- 25. 데이터베이스에서지도에 타일을 그리는 방법은 무엇입니까?
- 26. 이미지에서 텍스트를 읽는 방법
- 27. android에서 OCR을 사용하여 이미지에서 텍스트를 읽는 방법
- 28. LibTiff.Net을 사용하여 1.5GB 타일 기반 TIFF 파일을 읽을 때 메모리가 부족합니다.
- 29. Cordova를 사용하여 이미지에서 텍스트를 추출하는 방법은 무엇입니까?
- 30. 타일을 사용하여 XNA에 타일을 만들고 저장하기