tiff-asyncio/src/parse_tiff.c
2025-07-11 19:42:03 +08:00

88 lines
2.7 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <stdio.h>
#include <stdlib.h>
#include <tiffio.h>
int main()
{
TIFF *tif = TIFFOpen("imgs/ortho.tif", "r");
if (!tif)
{
printf("Failed to open file.\n");
return 1;
}
uint32 tileWidth, tileHeight;
TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tileWidth);
TIFFGetField(tif, TIFFTAG_TILELENGTH, &tileHeight);
printf("Tile size: %dx%d\n", tileWidth, tileHeight);
uint32 imageWidth, imageHeight;
TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &imageWidth);
TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &imageHeight);
uint32 tilesAcross = (imageWidth + tileWidth - 1) / tileWidth;
uint32 tilesDown = (imageHeight + tileHeight - 1) / tileHeight;
uint32 totalTiles = tilesAcross * tilesDown;
printf("Tile count: %d x %d = %d\n", tilesAcross, tilesDown, totalTiles);
uint16 samplesPerPixel;
uint16 bitsPerSample;
TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &samplesPerPixel);
TIFFGetField(tif, TIFFTAG_BITSPERSAMPLE, &bitsPerSample);
printf("Samples per pixel: %d\n", samplesPerPixel);
printf("Bits per sample: %d\n", bitsPerSample);
uint16 sampleFormat = SAMPLEFORMAT_UINT;
TIFFGetField(tif, TIFFTAG_SAMPLEFORMAT, &sampleFormat);
printf("Sample format: %d\n", sampleFormat); // 1=uint, 2=int, 3=float
tsize_t tileBufSize = TIFFTileSize(tif);
if (tileBufSize == 0)
{
printf("TIFFTileSize returned 0. Possibly not tiled.\n");
TIFFClose(tif);
return 1;
}
// 分配一个缓冲区用于存放一个 tile 的像素数据(未压缩)
uint8_t *tileBuf = (uint8_t *)_TIFFmalloc(tileBufSize);
if (!tileBuf)
{
fprintf(stderr, "Failed to allocate tile buffer.\n");
TIFFClose(tif);
return 1;
}
// 遍历每个 tile 并解码为像素数据
for (uint32 i = 0; i < totalTiles; i++)
{
// 读取 tile 编号 i解码为原始像素存入 tileBuf
tsize_t readBytes = TIFFReadEncodedTile(tif, i, tileBuf, tileBufSize);
if (readBytes == -1)
{
fprintf(stderr, "Failed to decode tile %d\n", i);
continue;
}
printf("Tile %3d: Decoded %6ld bytes (uncompressed pixel data)\n",
i, (long)readBytes);
// 示例打印前4个像素假设每像素 samplesPerPixel 个 uint8 通道)
for (int px = 0; px < 4 && px < (readBytes / samplesPerPixel); px++)
{
printf(" Pixel %d: ", px);
for (int s = 0; s < samplesPerPixel; s++)
{
printf("%3u ", tileBuf[px * samplesPerPixel + s]);
}
printf("\n");
}
}
_TIFFfree(tileBuf);
TIFFClose(tif);
return 0;
}