我正在尝试编写一个多页 tiff 文件,它是 128 像素 x 128 像素 x 122000 帧的 16 位无符号整数。ImageJ 或简短的 Python 脚本可以在不到一分钟的时间内在快速机器上完成此操作。在同一台机器上,使用我尝试过的任何方法,MATLAB 可能需要几天时间才能完成。这是我迄今为止尝试过的:
使用 imwrite 将 IMG 写入 test.tif(MATLAB 文档推荐)
tic
numframes=size(IMG,3);
divider=10^(floor(log10(numframes))-1);
imwrite(IMG(:,:,1),'test.tif');
for i=2:numframes;
imwrite(IMG(:,:,i),'test.tif','WriteMode','append');
if (round(i/divider)==i/divider)
fprintf('Frame %d written in %.0f seconds, %2d percent complete, time left=%.0f seconds \n', ...
i, toc, i/numframes*100, (numframes - i)/(i/toc));
end
end
Run Code Online (Sandbox Code Playgroud)
这导致以下输出:
第 10000 帧在 104 秒内写入,8.196721e+00% 完成,剩余时间=1163 秒 20000 帧在 296 秒内写入,1.639344e+01% 完成,剩余时间=1509 秒 30000 帧写入 5.4509%,296 秒完成,剩余时间=1809 秒 40000 帧用 1035 秒写入,3.278689e+01% 完成,剩余时间=2121 秒 …
我有一个形式的ESRI ASCII文件:
ncols 5
nrows 4
xllcorner 0
yllcorner 0
cellsize 10
NODATA_value -9999
25.4 26.1 27 28.6 27.7
25 26 26.4 27.9 27.4
25.1 25.8 26.8 28.6 27.6
27.5 28 27.7 30.6 28.3
Run Code Online (Sandbox Code Playgroud)
我需要使用libtiff.net(或其C++等价物,libtiff或libgeotiff,或GDAL,或任何其他C#或C++库)将其转换为geotiff文件.
但我根本不知道要设置的字段是什么,有很多字段,例如TIFFTAG_IMAGEWIDTH
,TIFFTAG_SAMPLESPERPIXEL
或者TIFFTAG_BITSPERSAMPLE
我不知道它们是否相关.
给定如上所述的ESRI ASCII文件,如何使用libtiff.net或libtiff库创建geotiff文件?
在我的应用程序中,我有一个网格,我必须将网格转换为光栅文件.我想直接从网格采样创建这样的geotiff光栅文件,而不首先创建中间ASCII文件,因为中间文件大小与最终geotiff输出文件相比非常大.
我能想到的唯一方法是使用libtiff.net直接操作geotiff文件,同时获取网格上的网格点.
怎么做,还是有更好的方法?
我想在Android上移植libtiff.我使用的源版本是tiff 4.0.1.我在u1 android OS中构建这个源代码.运行mmm external/tiff 4.0.1 /我收到以下错误
In file included from external/tiff-4.0.1/libtiff/tiffiop.h:33,
from external/tiff-4.0.1/libtiff/tif_dirread.c:42:
external/tiff-4.0.1/libtiff/tif_config.h:93:1: warning: "HAVE_MALLOC_H" redefined
In file included from <command-line>:0:
./system/core/include/arch/linux-arm/AndroidConfig.h:221:1: warning: this is the location of the previous definition
In file included from external/tiff-4.0.1/libtiff/tif_dirread.c:42:
external/tiff-4.0.1/libtiff/tiffiop.h:54:21: error: search.h: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我尝试在互联网上搜索很多,但无法解决问题.任何人都可以向我提供一个大概可能出错的地方或缺少哪个包裹.
我试图通过C语言处理每通道16位RGBA TIFF图像,我在规范中找不到关于16位图像的大量信息.
在每通道8位RGBA图像的情况下,我理解像素存储为uint32,并且可以通过将32位分组为8位的4组(R,G,B,A)来进行解交织.然后为了处理每通道8位RGBA图像,我正在做以下事情(另请参见此处附带的源代码):
data_tiff
(uint8) TIFFGetR(*data_tiff)
,(uint8) TIFFGetG(*data_tiff)
,(uint8) TIFFGetB(*data_tiff)
及(uint8) TIFFGetA(*data_tiff)
如果每通道RGBA图像为16位,您能告诉我如何对像素进行去隔行扫描?如果我可以将图像数据作为uint64选项卡进行检索,那么我可以执行以下操作:
#define TIFF16GetR(abgr) ((abgr) & 0xffff)
#define TIFF16GetG(abgr) (((abgr) >> 16) & 0xffff)
#define TIFF16GetB(abgr) (((abgr) >> 32) & 0xffff)
#define TIFF16GetA(abgr) (((abgr) >> 48) & 0xffff)`
Run Code Online (Sandbox Code Playgroud)
(uint16) TIFF16GetR(*data_tiff)
,(uint16) TIFF16GetG(*data_tiff)
,(uint16) TIFF16GetB(*data_tiff)
及(uint16) TIFF16GetA(*data_tiff)
但似乎数据本身并未存储在uint64选项卡中,所以我想知道如何将每通道16位的图像隔行扫描到uint32像素选项卡中.
我也面临着以相同方式处理16位灰度图像的困难(使用TIFFReadRGBAImageOriented
获取图像数据并尝试将每个像素转换为uint16)
更一般地说,你有任何关于16位灰度和彩色图像的文档吗?
谢谢您最好的问候,
雷米A.
我\xe2\x80\x99m对libtiff相当陌生,但我\xe2\x80\x99已经设法获得tiff文件\n保存和打开没有太多麻烦。
\n\n现在,我\xe2\x80\x99m雄心勃勃,并尝试将自定义标签添加到我的文件中。我\xe2\x80\x99ve\n阅读了文档(请参阅此处)并编写了一些测试代码,这些代码编译时没有\n错误,但在运行时失败,并在第一次调用\n具有自定义字段的 TIFFSetField 时发生访问冲突(调用 TIFFSetField带有\n标准字段就可以了)。
\n\n我的测试代码如下:不到 100 行,唯一的外部依赖项(除了 libtiff)是我从 .pgm 文件打开测试图像的代码。谁能指出我\xe2\x80\x99m 做错了什么?顺便说一句,我正在使用 libtiff 4.0.3。
\n\n#include "stdafx.h"\n#include "PGM.h" // Just for reading in the test image\n#include "tiffio.h"\n\n// There are a number of TIFF-related definitions we need to make in order to support the custom tags\n// that we want to include in our files. The form of these definitions and subroutines comes straight\n// out of the libtiff documentation, and the values of the custom tags themselves come …
Run Code Online (Sandbox Code Playgroud) 我正在研究一些高清成像软件,虽然这个版本目前没有规划非常大的纹理,但我想做一些未来的打样.
如果我正在处理非常大的纹理(例如1095630 x 939495),我可以使用压缩纹理和mip贴图的标准组合,或者这些纹理是否会大到存储在纹理内存中?
我的假设是它们太大了,我不得不在CPU上做一个psudeo手动mip贴图.即抓取非常大的数据,为完全缩小创建一个合理的压缩版本然后随着用户放大,将大纹理的子部分发送到GPU?
在CPU上执行压缩的想法非常慢,所以我的计划是将数据平铺并将其发送到GPU以进行压缩.在这种情况下,我如何找出(最好是动态的)GPU可以处理的最大纹理尺寸?
我是TIFF格式的新手,但从它的外观来看,它已经存储为瓷砖,这是正确的吗?我希望与libtiff有点玩,但我没有找到很多使用它的例子(我的google技能今天让我失望,道歉). /sf/
现有的例子 我希望从这两个方面得到一些指示:
总结:
我正在使用金字塔的tiff文件.但是,OpenCV
不支持pyramided tiff文件,因此我尝试使用libtiff 4.0.3
提取我需要的图层/目录/分辨率,然后将其传递给OpenCV
进行处理.
我包括如下:
#include "tiffio.h"
#include "opencv2/highgui/highgui.hpp"
Run Code Online (Sandbox Code Playgroud)
但这样做给了我以下内容types_c.h
:
typedef int64_t int64;
Typedef redefinition with different types ('int64_t(aka 'long long') vs 'long')
Run Code Online (Sandbox Code Playgroud)
似乎int64_t由两个库中的每个库以不同方式定义.
我已经习惯homebrew
安装这两个库,所以我不想编辑这些库,因为这会导致更新问题,对我团队的未来开发人员来说是一个痛苦等等.
有没有办法可以使用这两个库而不修改它们?
我正在尝试从任意像素阵列生成 TIFF/EP Profile 2 原始 (.dng) 图像。该像素阵列代表拜耳模式(CFA)。
我研究了 TIFF/EP 文件规范,并通过使用 libtiff,包含了我认为生成完整 .dng 文件所需的所有标签。但是,我无法使用 dcraw 转换创建的文件(dcraw 显示无法解码文件)。
一个问题可能是由两个标签引起的,这两个标签在 TIFF/EP 规范中被声明为强制标签,但似乎并未在 libtiff 中实现:SensingMethod 和 TIFF/EPStandardID 标签。我真的必须包含它们吗(我已经看到示例代码忽略了这些标签,但仍然报告可以正常工作),如果是这样,我如何手动将它们添加到 libtiff 中?此外,设置 SubIFD 标记会产生错误消息“断言失败:*pa<=0xFFFFFFFFUL,文件 tif_dirwrite.c,第 1869 行”
总而言之,我不认为我的问题只是由于这三个标签造成的,而且我相信存在根本性的错误。也许你们中的某个人可以看看我的代码并提供一些线索?我不得不说 libtiff 的文档相当差,所以我的代码受到了极少数示例代码之一的启发:elphel_dng.c。
非常感谢!法比安
附言。我将生成的文件上传到Dropbox
C++
#include "tiffio.h"
#include <iostream>
using namespace std;
int main(void)
{
TIFF *tif = TIFFOpen("8bitRaw.dng", "w");
const int sampleperpixel = 1;
const int width = 4;
const int height = 4;
static const short bayerPatternDimensions[] = { 2,2 };
static const …
Run Code Online (Sandbox Code Playgroud) 在我的应用程序套件中,我从源代码构建 Libtiff,然后将其链接到我自己编写的应用程序。Libtiff 的 CMakeLists.txt 文件指定静态库进入库位置 CMAKE_INSTALL_FULL_LIBDIR,由 CMake 的 GNUInstallDirs 选项确定。
当我第一次构建和测试我的应用程序时,我在 Debian 中这样做,并且在此平台上 CMAKE_INSTALL_FULL_LIBDIR 设置为 ${CMAKE_INSTALL_PREFIX}/lib。很好,所以在我自己的应用程序的 CMakeLists.txt 文件中,我告诉它在那里搜索静态 tiff 库。没问题...
现在,我已将相同的构建套件应用于 Red Hat Linux 平台(Pengwin Enterprise for WSL),结果发现此处 CMAKE_INSTALL_FULL_LIBDIR 设置为 ${CMAKE_INSTALL_PREFIX}/lib 64。我检查了CMake 文档,似乎说实际上“lib”或“lib64”的选择是自动确定的并且与平台相关。
那么,在我自己的应用程序的 CMakeLists.txt 文件中,有没有办法找出它在我当前平台上的位置?否则我该如何猜测去哪里寻找图书馆呢?我环顾四周,但找不到保存平台相关字符串的 CMAKE 标准变量,所以我唯一能想到的是:
...但这两种方法看起来都笨拙不雅,肯定有更好的方法。
当尝试使用 PIP 安装 Pillow 时,我收到以下包含错误:
\n\n\xce\xbc ~: pip install pillow\n...\nlibImaging/TiffDecode.h:10:10: fatal error: 'tiffio.h' file not found\n\n#include <tiffio.h>\n\n ^\n\n1 error generated.\n\nerror: command 'cc' failed with exit status 1\n
Run Code Online (Sandbox Code Playgroud)\n\n有谁知道如何解决这个问题?我使用的是 OS X 10.9,之前已经能够在这台计算机上构建 Pillow。
\n\n更新:请注意,我tiffio.h
的机器上有/usr/local/include/tiffio.h
. 将该目录设置为 C 包含路径后,我能够成功编译 Pillow。
\xce\xbc ~: C_INCLUDE_PATH=/usr/local/include\n\xce\xbc ~: pip install pillow\nDownloading/unpacking pillow\n...\nSuccessfully installed pillow\nCleaning up...\n
Run Code Online (Sandbox Code Playgroud)\n\n这是应该如何完成的,还是我的机器或安装包有问题?
\n