C# 使用bittiff.net创建Bigtiff(>;4GB)文件

C# 使用bittiff.net创建Bigtiff(>;4GB)文件,c#,.net,tiff,imaging,libtiff.net,C#,.net,Tiff,Imaging,Libtiff.net,首先,我要感谢Bitmiracle提供了这个伟大的自由。即使创建非常大的文件,内存占用也非常低。 几天前,我遇到了一个问题,我想创建一个大于4GB的tiff文件。我成功地创建了平铺tiff文件,但似乎在4GB以上创建的平铺颜色在某种程度上是颠倒的 以下代码为相关代码: 用法: WriteTiledTiff("bigtiff.tiff",BitmapSourceFromBrush(new RadialGradientBrush(Colors.Aqua,Colors.Red), 256)); 方

首先,我要感谢Bitmiracle提供了这个伟大的自由。即使创建非常大的文件,内存占用也非常低。 几天前,我遇到了一个问题,我想创建一个大于4GB的tiff文件。我成功地创建了平铺tiff文件,但似乎在4GB以上创建的平铺颜色在某种程度上是颠倒的

以下代码为相关代码:

用法:

WriteTiledTiff("bigtiff.tiff",BitmapSourceFromBrush(new RadialGradientBrush(Colors.Aqua,Colors.Red), 256));
方法:

public static BitmapSource BitmapSourceFromBrush(Brush drawingBrush, int size = 32, int dpi = 96)
    {
        // RenderTargetBitmap = builds a bitmap rendering of a visual
        var pixelFormat = PixelFormats.Pbgra32;
        RenderTargetBitmap rtb = new RenderTargetBitmap(size, size, dpi, dpi, pixelFormat);

        // Drawing visual allows us to compose graphic drawing parts into a visual to render
        var drawingVisual = new DrawingVisual();
        using (DrawingContext context = drawingVisual.RenderOpen())
        {
            // Declaring drawing a rectangle using the input brush to fill up the visual
            context.DrawRectangle(drawingBrush, null, new Rect(0, 0, size, size));
        }

        // Actually rendering the bitmap
        rtb.Render(drawingVisual);
        return rtb;
    }

public static void WriteTiledTiff(string fileName, BitmapSource tile)
    {
        const int PIXEL_WIDTH = 48000;
        const int PIXEL_HEIGHT = 48000;

         int iTile_Width = tile.PixelWidth;
         int iTile_Height = tile.PixelHeight;

        using (Tiff tiff = Tiff.Open(fileName, "w"))
        {
            tiff.SetField(TiffTag.IMAGEWIDTH, PIXEL_WIDTH);
            tiff.SetField(TiffTag.IMAGELENGTH, PIXEL_HEIGHT);
            tiff.SetField(TiffTag.COMPRESSION, Compression.NONE);
            tiff.SetField(TiffTag.PHOTOMETRIC, Photometric.RGB);

            tiff.SetField(TiffTag.ROWSPERSTRIP, PIXEL_HEIGHT);

            tiff.SetField(TiffTag.XRESOLUTION, 96);
            tiff.SetField(TiffTag.YRESOLUTION, 96);

            tiff.SetField(TiffTag.BITSPERSAMPLE, 8);
            tiff.SetField(TiffTag.SAMPLESPERPIXEL, 3);

            tiff.SetField(TiffTag.PLANARCONFIG, PlanarConfig.CONTIG);

            tiff.SetField(TiffTag.TILEWIDTH, iTile_Width);
            tiff.SetField(TiffTag.TILELENGTH, iTile_Height);

            int tileC = 0;
            for (int row = 0; row < PIXEL_HEIGHT; row += iTile_Height)
            {
                for (int col = 0; col < PIXEL_WIDTH; col += iTile_Width)
                {
                    if (tile.Format != PixelFormats.Rgb24) tile = new FormatConvertedBitmap(tile, PixelFormats.Rgb24, null, 0);
                    int stride = tile.PixelWidth * ((tile.Format.BitsPerPixel + 7) / 8);

                    byte[] pixels = new byte[tile.PixelHeight * stride];
                    tile.CopyPixels(pixels, stride, 0);

                    tiff.WriteEncodedTile(tileC++, pixels, pixels.Length);
                }
            }

            tiff.WriteDirectory();
        }
    }
公共静态位图源BitmapSourceFromBrush(笔刷绘制笔刷,int size=32,int dpi=96)
{
//RenderTargetBitmap=生成可视对象的位图渲染
var pixelFormat=PixelFormats.Pbgra32;
RenderTargetBitmap rtb=新的RenderTargetBitmap(大小、大小、dpi、dpi、像素格式);
//Drawing visual允许我们将图形绘图部件组合到一个要渲染的可视化图形中
var drawingVisual=新的drawingVisual();
使用(DrawingContext=drawingVisual.Renderropen())
{
//声明使用输入画笔绘制矩形以填充视觉效果
DrawRectangle(drawingBrush,null,new Rect(0,0,size,size));
}
//实际渲染位图
rtb.渲染(绘图视觉);
返回rtb;
}
public static void WriteTiledTiff(字符串文件名,BitmapSource磁贴)
{
const int PIXEL_WIDTH=48000;
const int PIXEL_HEIGHT=48000;
int iTile_Width=tile.PixelWidth;
int iTile_Height=tile.PixelHeight;
使用(Tiff Tiff=Tiff.Open(文件名,“w”))
{
tiff.SetField(TiffTag.IMAGEWIDTH,像素宽度);
tiff.SetField(TiffTag.IMAGELENGTH,像素高度);
设置字段(TiffTag.COMPRESSION,COMPRESSION.NONE);
tiff.SetField(tiff标记.光度控制,光度控制.RGB);
tiff.SetField(TiffTag.ROWSPERSTRIP,像素高度);
tiff.设置字段(TiffTag.X分辨率,96);
tiff.设置字段(tiff TAG.YRESOLUTION,96);
tiff.SetField(TiffTag.BITSPERSAMPLE,8);
tiff.SetField(TiffTag.samplesperpoixel,3);
tiff.SetField(TiffTag.PLANARCONFIG,PLANARCONFIG.CONTIG);
tiff.SetField(TiffTag.TILEWIDTH,iTile_宽度);
tiff.设置字段(TiffTag.TILELELENGTH,iTile_高度);
int-tileC=0;
对于(int行=0;行<像素高度;行+=iTile高度)
{
对于(int col=0;col

生成的文件大小将为6,47GB。我用一个名为“vliv”的小工具查看了它

所有LibTiff.Net版本,包括2.4.500.0,都基于原始LibTiff的3.x分支

对BigTIFF的支持是在原始libtiff的4.x分支中引入的。因此,目前还没有设计用于处理BigTiff文件/磁盘上超过4GB的文件的LibTiff.Net版本

编辑:


LibTiff.Net 2.4.508增加了对BigTiff的支持。

你确定vliv可以处理大于4 GB的文件吗?是的,但是如果你有16gb的ram,你也可以用Gimp打开它。^^^非常感谢你的快速回答!我是否必须通过手动设置特定标记来启用BigTiff支持?不,您不能。库应在其大小大于TIFF允许的大小时立即创建BigTIFF文件。即使大小小于4gb,是否有可能强制使用“BigTIFF”?