Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ TIFF读写TIFFTAG_ROWSPERSTRIP相关性_C++_Io_Tiff_Libtiff - Fatal编程技术网

C++ TIFF读写TIFFTAG_ROWSPERSTRIP相关性

C++ TIFF读写TIFFTAG_ROWSPERSTRIP相关性,c++,io,tiff,libtiff,C++,Io,Tiff,Libtiff,我的代码逐行读取(tiffIn)和写入(tiffOut)一个tiff图像,我打开一个带有#include“tiffio.h”的tiff文件,读取每个标签并将其完全复制到新的tiff中。我更改的唯一标记是: int rows_per_strip = 65536 * 8 /(nc * nx * bps); if (rows_per_strip == 0) rows_per_strip = 1; 其中nc、nx、ny和bps为: TIFFGetField (tiffIn, TIFFTAG_IMAGE

我的代码逐行读取(
tiffIn
)和写入(
tiffOut
)一个tiff图像,我打开一个带有
#include“tiffio.h”
的tiff文件,读取每个标签并将其完全复制到新的tiff中。我更改的唯一标记是:

int rows_per_strip = 65536 * 8 /(nc * nx * bps);
if (rows_per_strip == 0) rows_per_strip = 1;
其中nc、nx、ny和bps为:

TIFFGetField (tiffIn, TIFFTAG_IMAGELENGTH, &ny)
TIFFGetField (tiffOut, TIFFTAG_IMAGEWIDTH, &nx);
TIFFGetField (tiffOut, TIFFTAG_BITSPERSAMPLE, &bps);
TIFFGetField (tiffOut, TIFFTAG_SAMPLESPERPIXEL, &nc);
每个条带的行数是:

TIFFSetField (tiffOut, TIFFTAG_ROWSPERSTRIP,    rows_per_strip);
读取和写入的for循环可以总结为:

for(int i = 0; i<ny; i++){
unsigned char * dataptr=new unsigned char[sll];
TIFFReadScanline(tiffIn, dataptr, line, 0);
TIFFWriteScanline (tiffOut, dataptr, line);
delete[] dataptr;
}
使用gimp打开已写入的TIFF文件时,出现错误:

 Wrong "StripByteCounts" field, ignoring and calculating from imagelength
图像以这种方式显示:

但我读写标签时使用:

 unsigned short int stmp;
 unsigned short int striptBytesCount;

 TIFFGetField(tiffIn, TIFFTAG_STRIPBYTECOUNTS,&stmp);
 striptBytesCount=stmp;

 TIFFSetField (tiffOut, TIFFTAG_STRIPBYTECOUNTS, striptBytesCount);
所以这应该是正确的。
此外,如果我更改
rows\u per\u strip
标记,并分配
1
,图像将正确显示。

您的
for
循环存在巨大的内存泄漏,除非您在循环中的某个地方调用
delete[]
。另外,为什么在1开始循环?它不应该从0开始吗?我知道内存泄漏,但是因为在原始代码中它有点复杂,正如您所看到的,我总结了一下。我将更改它添加删除[]将1更改为0。同样,这只是一个概念性的证明。如果你看那些关闭的扫描线,它们会模仿整个图片的颜色方案。看起来这些线是来自现有线或扩展现有线的工件。可能您的某个“读取”失败或脱离轨道,读取了太多数据。
 unsigned short int stmp;
 unsigned short int striptBytesCount;

 TIFFGetField(tiffIn, TIFFTAG_STRIPBYTECOUNTS,&stmp);
 striptBytesCount=stmp;

 TIFFSetField (tiffOut, TIFFTAG_STRIPBYTECOUNTS, striptBytesCount);