.tiff
or .tif
typedef struct _TiffHeader
{
WORD Identifier;
/* Byte-order Identifier (2byte)
49 49 (Little Endian) 혹은 4D 4D (Big Endian) => Tiff*/
WORD Version; /* TIFF version number (always 2Ah)
00 2A (Little Endian) 혹은 2A 00 (Big Endian)(2byte)*/
DWORD IFDOffset; /* Offset of the first Image File Directory*/
} TIFHEAD;
typedef struct _TifIfd
{
WORD NumDirEntries; /* Number of Tags in IFD (2바이트)*/
TIFTAG TagList[];
/* 태그 배열 태그는 이미지 크기, 컬러, 압축 등의 정보를 가지고 있음.
각 태그는 12바이트의 크기를 지님. */
DWORD NextIFDOffset;
/* 다음 IFD의 offset 정보.
만약 다음 IFD가 없다면 00 00 00 00 의 값을 가짐.(4byte)*/
} TIFIFD;
typedef struct _TifTag
{
WORD TagId; /* The tag identifier(2byte) */
WORD DataType; /* 데이터 아이템의 타입(2byte) */
DWORD DataCount; /* 태그 데이터 안의 아이템 갯수(4byte) */
DWORD DataOffset; /* 데이터 아이템의 byte offset(4byte) */
} TIFTAG;
TIFF 에서 이미지 데이터를 구성하는 방식
Strips는 가로로 나누어진 1차원 데이터로, 이미지의 연속된 행을 담고 있음
Strips는 이미지를 일렬로 분할하여 처리하고 액세스하는데 효과적이지만, 전체 스트립을 읽어야 한다는 단점이 있습니다.
Tiles는 Strips와 달리 사각형 형태의 2차원 데이터로, 작은 비트맵 조각으로 이루어져 있습니다.
Tiles는 이미지를 작은 조각으로 분할하여 필요한 부분만 처리하고 액세스할 수 있게 해줍니다. 또한, 압축 알고리즘을 사용할 때 Tiles는 압축 해제를 최적화하는 데 도움이 됩니다.
from tifffile import imsave
import numpy as np
# create data
d = np.ndarray(shape=(10,20), dtype=np.float32) # also supports 64bit but ImageJ does not
d[()] = np.arange(200).reshape(10, 20)
# save 32bit float (== single) tiff
imsave('test.tif', d) #, description="hohoho")
from PIL import Image
import numpy as np
# create data
d = np.ndarray(shape=(10,20), dtype=np.float32)
d[()] = np.arange(200).reshape(10, 20)
im = Image.fromarray(d, mode='F') # float32
im.save("test2.tiff", "TIFF")
tifffile.imwrite(str(name[0])+"_compressed.tif", prediction_stack_16, metadata={'axes': 'XYZC'}, compression ='zlib')
tifffile.imwrite("_compressed.ome.tif", prediction_stack_16,imagej=True, resolution=(1./0.22, 1./0.22), metadata={'spacing': 0.72, 'unit': 'um', 'axes': 'ZCYX'}, compression ='zlib')