使用tiff库写tiff黑白图

    前言:我用的资源库为:http://download.csdn.net/detail/fx_odyssey/9838235,适用于vs2008。当然,网上的libtiff和此源码文件具有同样功能,下面的代码对两种资源库均适用。个人习惯能查看源码,网上提供的libtiff.lib看不了。

    首先,vs2008创建win32空工程(vs其它版本也可以),将上述下载链接的所有程序文件导入工程。如下图所示(source.h可忽略,无影响):


    创建source.cpp文件,键入代码:

#define BYTE unsigned char

#include <iostream>
#include <cstdlib>
#include "tiffio.h"
using namespace std;
bool CreatTiffFile(char *FileName, unsigned char *Buf, int width, int height);
bool ArrCompress(BYTE *arrSrc, BYTE *arrTo, int width, int height, int width_W);

int main()
{
    int width = 8, height = 1, pixel = width * height;
    char *tifName = "Demo.tif";
    BYTE *RImage = new BYTE[pixel];
    BYTE *NRImage = new BYTE[((width - 1)/8 + 1) * height];
    for (int i = 0; i < pixel; i++)
    {
/*if (i%160 == 80 || (i > 12800 && i < 12960))
{
RImage[i] = 0xff;
}
else
{
RImage[i] = 0x00;
}*/
//if (i%160 == 10 || i%160 == 130 || i%160 == 50)
//{
// RImage[i] = 0x00;
//}
//else
//{
// RImage[i] = 0xff;
//}
RImage[i] = 0x00;
//if (i == 12881)
//{
// RImage[i] = 0x00;
//}
//else
//{
// RImage[i] = 0xff;
//}
    }
//RImage[12800+80] = 0xff;
    for (int i = 0; i < ((width - 1)/8 + 1) * height; i++)
    {
        NRImage[i] = 0x00;
    }
    竖线
    //for (int i = 0; i < height; i++)
    //{
    //    for (int j = 0; j < width; j++)
    //    {
    //        if (j%16 == 0)
    //        {
    //            RImage[width * i + j] = 0xff;
    //        }
    //    }
    //}
    横线
    //for (int i = 0; i < height; i++)
    //{
    //    for (int j = 0; j < width; j++)
    //    {
    //        if (i%16 == 0)
    //        {
    //            RImage[width * i + j] = 0xff;
    //        }
    //    }
    //}
    if (!ArrCompress(RImage, NRImage, width, height, (width - 1)/8 + 1))
    {
        cout << "ArrCompress false." << endl;
        system("pause");
    }
    if (!CreatTiffFile(tifName, NRImage, width, height))
    {
        cout << "CreateTiffFile false." << endl;
        system("pause");
    }


    return 0;
}


bool CreatTiffFile(char *FileName, unsigned char *Buf, int width, int height)
{
    TIFF *imageTest;
    if ((imageTest = TIFFOpen(FileName, "w")) == NULL) {
        printf("Could not open output.tif for writing\n");
        cout << "open is failed.\n";
        system("pause");
        return false;
    }
    TIFFSetField(imageTest, TIFFTAG_IMAGEWIDTH, width);
    TIFFSetField(imageTest, TIFFTAG_IMAGELENGTH, height);
    TIFFSetField(imageTest, TIFFTAG_BITSPERSAMPLE, 1);// bits per channel (sample) 每个通道(样本)(1bit或者8bit)
    TIFFSetField(imageTest, TIFFTAG_SAMPLESPERPIXEL, 1);// samples per pixel 每像素采样(1通道或者3通道)
    TIFFSetField(imageTest, TIFFTAG_ROWSPERSTRIP, height);           // rows per strip of data 每条数据行(写入像素的高度限制)
    TIFFSetField(imageTest, TIFFTAG_COMPRESSION, COMPRESSION_CCITTFAX4);
    TIFFSetField(imageTest, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISWHITE);
    TIFFSetField(imageTest, TIFFTAG_FILLORDER, FILLORDER_MSB2LSB);
    TIFFSetField(imageTest, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
    TIFFSetField(imageTest, TIFFTAG_XRESOLUTION, 600.0);
    TIFFSetField(imageTest, TIFFTAG_YRESOLUTION, 600.0);
    TIFFSetField(imageTest, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH);


    // Write the information to the file
    TIFFWriteEncodedStrip(imageTest, 0, Buf, width/8 * height);
    TIFFClose(imageTest);
    return true;
}


bool ArrCompress(BYTE *arrSrc, BYTE *arrTo, int width, int height, int width_W)
{
    //int width_W = (width - 1)/8 + 1;
    for (int h = 0; h < height; h++)
    {
        switch (width % 8)
        {
        case 0:
            {
                for (int w = 0; w < width_W; w++)
                {
                    arrTo[width_W * h + w] = (arrSrc[width * h + w * 8 + 0] & 0x80) |
                        (arrSrc[width * h + w * 8 + 1] & 0x40) | (arrSrc[width * h + w * 8 + 2] & 0x20) |
                        (arrSrc[width * h + w * 8 + 3] & 0x10) | (arrSrc[width * h + w * 8 + 4] & 0x08) |
                        (arrSrc[width * h + w * 8 + 5] & 0x04) | (arrSrc[width * h + w * 8 + 6] & 0x02) |
                        (arrSrc[width * h + w * 8 + 7] & 0x01);
                }
                break;
            }
        case 1:
            {
                for (int w = 0; w < width_W - 1; w++)
                {
                    arrTo[width_W * h + w] = (arrSrc[width * h + w * 8 + 0] & 0x80) |
                        (arrSrc[width * h + w * 8 + 1] & 0x40) | (arrSrc[width * h + w * 8 + 2] & 0x20) |
                        (arrSrc[width * h + w * 8 + 3] & 0x10) | (arrSrc[width * h + w * 8 + 4] & 0x08) |
                        (arrSrc[width * h + w * 8 + 5] & 0x04) | (arrSrc[width * h + w * 8 + 6] & 0x02) |
                        (arrSrc[width * h + w * 8 + 7] & 0x01);
                }
                arrTo[width_W * h + width_W - 1] = arrSrc[width * h + (width - 1) / 8 * 8 + 0] & 0x80;
                break;
            }
        case 2:
            {
                for (int w = 0; w < width_W - 1; w++)
                {
                    arrTo[width_W * h + w] = (arrSrc[width * h + w * 8 + 0] & 0x80) |
                        (arrSrc[width * h + w * 8 + 1] & 0x40) | (arrSrc[width * h + w * 8 + 2] & 0x20) |
                        (arrSrc[width * h + w * 8 + 3] & 0x10) | (arrSrc[width * h + w * 8 + 4] & 0x08) |
                        (arrSrc[width * h + w * 8 + 5] & 0x04) | (arrSrc[width * h + w * 8 + 6] & 0x02) |
                        (arrSrc[width * h + w * 8 + 7] & 0x01);
                }
                arrTo[width_W * h + width_W - 1] = (arrSrc[width * h + (width - 1) / 8 * 8 + 0] & 0x80) |
                    (arrSrc[width * h + (width - 1) / 8 * 8 + 1] & 0x40);
                break;
            }
        case 3:
            {
                for (int w = 0; w < width_W - 1; w++)
                {
                    arrTo[width_W * h + w] = (arrSrc[width * h + w * 8 + 0] & 0x80) |
                        (arrSrc[width * h + w * 8 + 1] & 0x40) | (arrSrc[width * h + w * 8 + 2] & 0x20) |
                        (arrSrc[width * h + w * 8 + 3] & 0x10) | (arrSrc[width * h + w * 8 + 4] & 0x08) |
                        (arrSrc[width * h + w * 8 + 5] & 0x04) | (arrSrc[width * h + w * 8 + 6] & 0x02) |
                        (arrSrc[width * h + w * 8 + 7] & 0x01);
                }
                arrTo[width_W * h + width_W - 1] = (arrSrc[width * h + (width - 1) / 8 * 8 + 0] & 0x80) |
                    (arrSrc[width * h + (width - 1) / 8 * 8 + 1] & 0x40) | (arrSrc[width * h + (width - 1) / 8 * 8 + 2] & 0x20);
                break;
            }
        case 4:
            {
                for (int w = 0; w < width_W - 1; w++)
                {
                    arrTo[width_W * h + w] = (arrSrc[width * h + w * 8 + 0] & 0x80) |
                        (arrSrc[width * h + w * 8 + 1] & 0x40) | (arrSrc[width * h + w * 8 + 2] & 0x20) |
                        (arrSrc[width * h + w * 8 + 3] & 0x10) | (arrSrc[width * h + w * 8 + 4] & 0x08) |
                        (arrSrc[width * h + w * 8 + 5] & 0x04) | (arrSrc[width * h + w * 8 + 6] & 0x02) |
                        (arrSrc[width * h + w * 8 + 7] & 0x01);
                }
                arrTo[width_W * h + width_W - 1] = (arrSrc[width * h + (width - 1) / 8 * 8 + 0] & 0x80) |
                    (arrSrc[width * h + (width - 1) / 8 * 8 + 1] & 0x40) | (arrSrc[width * h + (width - 1) / 8 * 8 + 2] & 0x20) |
                    (arrSrc[width * h + (width - 1) / 8 * 8 + 3] & 0x10);
                break;
            }
        case 5:
            {
                for (int w = 0; w < width_W - 1; w++)
                {
                    arrTo[width_W * h + w] = (arrSrc[width * h + w * 8 + 0] & 0x80) |
                        (arrSrc[width * h + w * 8 + 1] & 0x40) | (arrSrc[width * h + w * 8 + 2] & 0x20) |
                        (arrSrc[width * h + w * 8 + 3] & 0x10) | (arrSrc[width * h + w * 8 + 4] & 0x08) |
                        (arrSrc[width * h + w * 8 + 5] & 0x04) | (arrSrc[width * h + w * 8 + 6] & 0x02) | 
                        (arrSrc[width * h + w * 8 + 7] & 0x01);
                }
                arrTo[width_W * h + width_W - 1] = (arrSrc[width * h + (width - 1) / 8 * 8 + 0] & 0x80) |
                    (arrSrc[width * h + (width - 1) / 8 * 8 + 1] & 0x40) | (arrSrc[width * h + (width - 1) / 8 * 8 + 2] & 0x20) |
                    (arrSrc[width * h + (width - 1) / 8 * 8 + 3] & 0x10) | (arrSrc[width * h + (width - 1) / 8 * 8 + 4] & 0x08);
                break;
            }
        case 6:
            {
                for (int w = 0; w < width_W - 1; w++)
                {
                    arrTo[width_W * h + w] = (arrSrc[width * h + w * 8 + 0] & 0x80) |
                        (arrSrc[width * h + w * 8 + 1] & 0x40) | (arrSrc[width * h + w * 8 + 2] & 0x20) |
                        (arrSrc[width * h + w * 8 + 3] & 0x10) | (arrSrc[width * h + w * 8 + 4] & 0x08) |
                        (arrSrc[width * h + w * 8 + 5] & 0x04) | (arrSrc[width * h + w * 8 + 6] & 0x02) |
                        (arrSrc[width * h + w * 8 + 7] & 0x01);
                }
                arrTo[width_W * h + width_W - 1] = (arrSrc[width * h + (width - 1) / 8 * 8 + 0] & 0x80) |
                    (arrSrc[width * h + (width - 1) / 8 * 8 + 1] & 0x40) | (arrSrc[width * h + (width - 1) / 8 * 8 + 2] & 0x20) |
                    (arrSrc[width * h + (width - 1) / 8 * 8 + 3] & 0x10) | (arrSrc[width * h + (width - 1) / 8 * 8 + 4] & 0x08) |
                    (arrSrc[width * h + (width - 1) / 8 * 8 + 5] & 0x04);
                break;
            }
        case 7:
            {
                for (int w = 0; w < width_W - 1; w++)
                {
                    arrTo[width_W * h + w] = (arrSrc[width * h + w * 8 + 0] & 0x80) |
                        (arrSrc[width * h + w * 8 + 1] & 0x40) | (arrSrc[width * h + w * 8 + 2] & 0x20) |
                        (arrSrc[width * h + w * 8 + 3] & 0x10) | (arrSrc[width * h + w * 8 + 4] & 0x08) |
                        (arrSrc[width * h + w * 8 + 5] & 0x04) | (arrSrc[width * h + w * 8 + 6] & 0x02) |
                        (arrSrc[width * h + w * 8 + 7] & 0x01);
                }
                arrTo[width_W * h + width_W - 1] = (arrSrc[width * h + (width - 1) / 8 * 8 + 0] & 0x80) |
                    (arrSrc[width * h + (width - 1) / 8 * 8 + 1] & 0x40) | (arrSrc[width * h + (width - 1) / 8 * 8 + 2] & 0x20) |
                    (arrSrc[width * h + (width - 1) / 8 * 8 + 3] & 0x10) | (arrSrc[width * h + (width - 1) / 8 * 8 + 4] & 0x08) |
                    (arrSrc[width * h + (width - 1) / 8 * 8 + 5] & 0x04) | (arrSrc[width * h + (width - 1) / 8 * 8 + 6] & 0x02);
                break;
            }
        default:
            break;
        }
    }
    return true;
}

    数据可以自己控制,目前仅能写tiff黑白图,日后会更新灰度tiff图和彩色tiff图。

    推荐博文:http://www.ibm.com/developerworks/cn/linux/guitoolkit/libtiff/part1/index.html

http://www.ibm.com/developerworks/cn/linux/guitoolkit/libtiff/part2/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值