逐行创建位图文件

时间:2009-12-28 06:24:22

标签: c# bitmap image-manipulation

是否可以逐行在C#中编写位图?我担心使用Bitmap.Save()函数在处理LARGE文件时需要太多内存..

为了澄清,我想这样做:

  1. 打开文件并编写位图标题(如果有)
  2. 将1个扫描行的图像数据放入缓冲区(byte [])
  3. 将缓冲区的内容写入文件
  4. 除非没有更多扫描线,否则从2开始重复
  5. 关闭文件
  6. 如何在C#中完成?

    谢谢,

    的Kreb

2 个答案:

答案 0 :(得分:0)

@Mikael

看起来像这样:

int bufferSize = ((width +31) >> 5) << 2); // the width is in pixels, 1bpp,
// so I had to round up to the nearest 32 bits

byte[] buffer = new byte[bufferSize];
byte[] buffer = new byte[height * bufferSize];

for (int i = 0; i < height; i++)
{
    getLine(buffer,bufferSize);
    Buffer.BlockCopy(bufffer,0,bigBuffer, i*bufferSize, bufferSize);
}

unsafe
{
    fixed (byte* ptr = bigBuffer)
    {
        using (Bitmap image = new Bitmap(width,height,bufferSize,System.Drawing.Imaging.PixelFormat.Format1bbIndexed, new IntPtr(ptr)))
        {
            image.SetResolution(xres,yres);
            image.Save(filename,System.Drawing.Imaging.ImageFormat.Tiff);
        }
    }
}

我担心对于非常大的图片,bigBuffer可能会变得太大..我想改变它来逐行写入文件,而不是一次性写入..

谢谢.. :))

答案 1 :(得分:0)

我曾经写过一些保存了32kx32k像素JPEG文件的代码。我在创建,加载,查看和操作它时遇到了很多问题(Photoshop可以处理高达30kx30k的文件)。 在尝试分配之后,我放弃了整个交易并决定将大图像的一部分保存到小图像中,并编写一些知道如何在需要时“缝合”这些文件的管理器程序。

我不确定你什么时候进去,但如果是为了展示那么你可以查看DeepZoom