前言:我用的资源库为: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/