c# - BitMiracle/libtiff.net 通过压缩将页面复制到其他 tiff
问题描述
我正在尝试构建一个读取 tiff 文件的程序,选择多个页面。提取这些页面并将其放入列表中
原始 tiff 具有 TiffCompressOption.Ccitt4 压缩。
从不同文件中提取 x 页后,我想使用 tifflib 重建 tiff。但是,当我创建 tiff 时,页面在相同压缩下不可见(可能已损坏)。当我用另一个压缩(RGB 上的 LZW 和 Photometrix)重建它时。它有效,只有 tiff 是 10 倍大。
代码如下:
public bool CreateTiff(List<Bitmap> listBitmap, string fileName)
{
int numberOfPages = listBitmap.Count;
using (Tiff output = Tiff.Open(fileName, "w"))
{
for (int page = 0; page < numberOfPages; ++page)
{
// get bufferData
var bmp = listBitmap[page];
byte[] raster = getImageRasterBytes(bmp, PixelFormat.Format32bppArgb);
output.SetField(TiffTag.IMAGEWIDTH, bmp.Width);
output.SetField(TiffTag.IMAGELENGTH, bmp.Height);
output.SetField(TiffTag.COMPRESSION, Compression.CCITT_T6);
output.SetField(TiffTag.PHOTOMETRIC, Photometric.MINISBLACK);
output.SetField(TiffTag.ROWSPERSTRIP, bmp.Height);
output.SetField(TiffTag.XRESOLUTION, bmp.HorizontalResolution);
output.SetField(TiffTag.YRESOLUTION, bmp.VerticalResolution);
output.SetField(TiffTag.BITSPERSAMPLE, 8);
output.SetField(TiffTag.SAMPLESPERPIXEL, 4);
output.SetField(TiffTag.PLANARCONFIG, PlanarConfig.CONTIG);
output.SetField(TiffTag.EXTRASAMPLES, 1, new short[] { (short)ExtraSample.UNASSALPHA });
output.SetField(TiffTag.PAGENUMBER, page, numberOfPages + 1);
int stride = raster.Length / bmp.Height;
convertSamples(raster, bmp.Width, bmp.Height);
for (int i = 0, offset = 0; i < bmp.Height; i++)
{
output.WriteScanline(raster, offset, i, 0);
offset += stride;
}
output.WriteDirectory();
}
}
Process.Start(fileName);
return true;
}
private static void convertSamples(byte[] data, int width, int height)
{
int stride = data.Length / height;
const int samplesPerPixel = 4;
for (int y = 0; y < height; y++)
{
int offset = stride * y;
int strideEnd = offset + width * samplesPerPixel;
for (int i = offset; i < strideEnd; i += samplesPerPixel)
{
byte temp = data[i + 2];
data[i + 2] = data[i];
data[i] = temp;
}
}
}
private static byte[] getImageRasterBytes(Bitmap bmp, PixelFormat format)
{
Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
byte[] bits = null;
try
{
// Lock the managed memory
BitmapData bmpdata = bmp.LockBits(rect, ImageLockMode.ReadWrite, format);
// Declare an array to hold the bytes of the bitmap.
bits = new byte[bmpdata.Stride * bmpdata.Height];
// Copy the values into the array.
System.Runtime.InteropServices.Marshal.Copy(bmpdata.Scan0, bits, 0, bits.Length);
// Release managed memory
bmp.UnlockBits(bmpdata);
}
catch
{
return null;
}
return bits;
}
解决方案
推荐阅读
- ruby-on-rails - 无法运行 `identify` 命令。请安装 ImageMagick
- python - For 循环示例中的 Else
- c - 我在此代码中遇到错误(x 不是结构或联合的成员)
- flutter - 更改 ExpansionTile 中的尾随图标颜色
- c# - 在 Mono 管道中运行时使用 NSubstitute 的测试失败
- java - 如何将字符串数组中的一个值从一个活动发送到另一个活动?
- angular - 当我们实际上可以在不使用装饰器的情况下注入服务时,为什么要使用 @Injectable() 装饰器?
- ads - 从 LinkedIn 传递 UTM 参数以进行应用安装活动
- javascript - 如何在 eel python 中从用户那里获取图像输入?
- routes - Svelte page.js 路由 - 无法获取动态组件的传入道具