使用 LibTiff.net 裁剪 tiff 文件时更改图像颜色
Changing in image colors when crop a tiff file using LibTiff.net
我使用以下代码使用 LibTiff.net 库裁剪了 Tiff 图像的某些部分,但图像颜色更改为假或伪 colors.I 还尝试将光度标记更改为其他可能的参数,如 YCBCR 或 Pallete,但结果相似。原始图像和裁剪后的图像附在代码下方。
任何想法都将不胜感激,以帮助我解决这个问题。
using (input)
{
int scanlineSize = input.ScanlineSize();
byte[][] buffer = new byte[height][];
int yy = height/hRatio;
int xx = width/wRatio;
int yEnd = yo + yy;
// read
int k = 0;
for (int i = yo; i < yEnd ; i++)
{
buffer[k] = new byte[scanlineSize];
input.ReadScanline(buffer[k], i);
k++;
}
// write
byte[][] bigHolder = new byte[height][];
byte[][] holder = new byte[yy][];
using (Tiff output = Tiff.Open("output.tif", "w"))
{
output.SetField(TiffTag.SAMPLESPERPIXEL, samplesPerPixel);
output.SetField(TiffTag.IMAGEWIDTH, xx);
output.SetField(TiffTag.IMAGELENGTH, yy);
output.SetField(TiffTag.BITSPERSAMPLE, bitsPerSample);
output.SetField(TiffTag.ROWSPERSTRIP, output.DefaultStripSize(0));
output.SetField(TiffTag.PHOTOMETRIC, photo);
output.SetField(TiffTag.PLANARCONFIG, PlanarConfig.CONTIG);
int j = 0;
int w = scanlineSize / wRatio;
for (int i = 0; i < yy; i++)
{
bigHolder[i] = buffer[i].Skip(xo).ToArray();
holder[i] = bigHolder[i].Take(w).ToArray();
output.WriteScanline(holder[i], j);
j++;
}
}
}
我找到问题了!由于输入 tiff 每个像素包含 3 个样本,因此我跳过了图像像素的数量,而不是发生在“bigHolder[i] = buffer[i].Skip(xo).ToArray();”行中的样本。所以我将 xo 更改为 SamplePerPixel * xo 并且输出 tiff 保持真实颜色。
我使用以下代码使用 LibTiff.net 库裁剪了 Tiff 图像的某些部分,但图像颜色更改为假或伪 colors.I 还尝试将光度标记更改为其他可能的参数,如 YCBCR 或 Pallete,但结果相似。原始图像和裁剪后的图像附在代码下方。 任何想法都将不胜感激,以帮助我解决这个问题。
using (input)
{
int scanlineSize = input.ScanlineSize();
byte[][] buffer = new byte[height][];
int yy = height/hRatio;
int xx = width/wRatio;
int yEnd = yo + yy;
// read
int k = 0;
for (int i = yo; i < yEnd ; i++)
{
buffer[k] = new byte[scanlineSize];
input.ReadScanline(buffer[k], i);
k++;
}
// write
byte[][] bigHolder = new byte[height][];
byte[][] holder = new byte[yy][];
using (Tiff output = Tiff.Open("output.tif", "w"))
{
output.SetField(TiffTag.SAMPLESPERPIXEL, samplesPerPixel);
output.SetField(TiffTag.IMAGEWIDTH, xx);
output.SetField(TiffTag.IMAGELENGTH, yy);
output.SetField(TiffTag.BITSPERSAMPLE, bitsPerSample);
output.SetField(TiffTag.ROWSPERSTRIP, output.DefaultStripSize(0));
output.SetField(TiffTag.PHOTOMETRIC, photo);
output.SetField(TiffTag.PLANARCONFIG, PlanarConfig.CONTIG);
int j = 0;
int w = scanlineSize / wRatio;
for (int i = 0; i < yy; i++)
{
bigHolder[i] = buffer[i].Skip(xo).ToArray();
holder[i] = bigHolder[i].Take(w).ToArray();
output.WriteScanline(holder[i], j);
j++;
}
}
}
我找到问题了!由于输入 tiff 每个像素包含 3 个样本,因此我跳过了图像像素的数量,而不是发生在“bigHolder[i] = buffer[i].Skip(xo).ToArray();”行中的样本。所以我将 xo 更改为 SamplePerPixel * xo 并且输出 tiff 保持真实颜色。