有没有办法在LibTiff中如何从内存中读取文件并将其保存到内存?
在用其他库打开图像之前,我不想先将图像保存到光盘中...
非常感谢!
我正在尝试用LibTIFF写入10,12位RGB TIFF文件.
像素数据本地保存在unsigned short
缓冲区(16位)
1)如果设置TIFFTAG_BITSPERSAMPLE
为10或12,则从缓冲区中读取的位数不足,输出不正确.(我知道它只是读取每个组件10或12位,而不是16,这是问题)
2)我尝试将缓冲区中的位打包,因此它实际上是12-R,12-G,12-B.在这种情况下,我认为文件正确写入,但我找不到的查看器可以正确显示此图像.
3)如果我设置TIFFTAG_BITSPERSAMPLE
为16,观众可以显示TIFF图像,但是我有一个问题,我不知道图像最初是10位还是12位(如果我想稍后用LibTIFF读取它).此外,观众期望动态范围是16位而不是10或12,也导致视图不良.
4)最烦人的部分是我在网上找不到10,12或14位TIFF图像,看看标题应该是什么样子.
最后,将10或12位图像数据写入TIFF文件的正确方法是什么?
我想使用LibTiff来访问非常大的TIFF文件.我需要多个页面和磁贴等功能,所以LibTiff似乎是正确的方法.任何人都可以帮助我如何使用C#中的LibTiff?我找到了一些链接(比如blog.bee-ee,其中包含部分代码.但我不能超越一个版本.我看过FreeImage但发现它不合适(图片大约800 MPixel 8或16)位灰度 - > 800-1600 MByte)大小,我无法在32位环境中将其加载到内存中)
我在C/C++方面非常有经验,但还没有在C#中.任何人都可以帮我一个包装或一些提示吗?
注意:我需要页面访问tiff中的金字塔平面(多分辨率),256x256的图块可以快速访问图像的不同部分而无需立即加载.
[编辑] LibTIFF.NET解决方案对我来说似乎最实用.我现在正在将它集成到产品开发中,它可以让我从进出管理内存中省去很多麻烦.我还没有尝试过'回调'功能,这似乎可以通过.net方式很好地解决.感谢stackoverflow的帮助[/编辑]
如何tiff
用g4压缩编写文件?
imwrite(string("compressed.tif"), res);
Run Code Online (Sandbox Code Playgroud)
这是在发送数据之前处理图像数据,write_fax()
因此不需要进一步处理(已注释掉处理write_fax
)..但输出文件完全是黑色的..
res.convertTo(res, CV_32FC1, 1.0 / 255.0);
res = 1.0 - res;
res = Img + res;
threshold(res, res, 0.85, 1, THRESH_BINARY);
// sends data to `write_fax()`
Run Code Online (Sandbox Code Playgroud)
/*
* Compile
* # g++ txtbin.cpp -o txtbin -ltiff `pkg-config opencv --cflags --libs`
*
* Run
* # ./txtbin input.jpg output.png
*/
#include "string"
#include "fstream"
#include "/usr/include/opencv2/opencv.hpp"
#include "/usr/include/boost/tuple/tuple.hpp"
#include "/usr/include/x86_64-linux-gnu/tiff.h"
#include "/usr/include/x86_64-linux-gnu/tiffio.h"
#include <stdint.h>
#include <vector>
#include <stdexcept>
#include …
Run Code Online (Sandbox Code Playgroud) 我正在处理大约20000 x 20000像素的1gb大tiff图像.我需要在随机位置从图像中提取几个图块(大约300x300像素).
我尝试了以下解决方案:
Libtiff(我能找到的唯一低级库)提供了TIFFReadline(),但这意味着可以读取大约19700个不必要的像素.
我实现了自己的tiff阅读器,它从图像中提取出一块瓷砖,而不需要读取不必要的像素.我预计它会更快,但对瓷砖的每一行进行搜索会使它变得非常慢.我也尝试读取包含我的磁贴的文件的所有行的缓冲区,然后从缓冲区中提取磁贴,但结果或多或少相同.
我想收到改善我的瓷砖提取工具的建议!
一切都是受欢迎的,也许你可以提出一个我可以使用的更高效的库,一些关于C/C++ I/O的技巧,一些针对我的需求的更高级别的策略等等.
问候,胡安
我知道thumbnail.c包含一些创建缩略图并将其放在子IDF中的代码,但是代码中有很多(生成缩略图,应用对比曲线等),我很难再现写一个缩略图.谷歌也没有任何帮助.
我的问题是,在我打开一个输出文件并且有一个TIFF*之后,我的缩略图数据都已准备就绪(以及我的主图像数据),如何以缩略图所在的方式添加它们主图像IFD的子IFD?
我目前正在开展一个项目,该项目要求我将TIFF图像拆分为包含所有标签的文件和包含所有图像数据的文件,并从这些文件重建TIFF图像.唯一的问题是,似乎LibTIFF没有提供从图像中获取所有标签的简单方法.我尝试使用TIFFGetTagListCount然后使用TIFFGetField来检索标记,但这只返回了一小部分标记.我已经开始滚动我自己的版本了,但我只想仔细检查并确保我不会忽略某些内容,因为这似乎是一个非常明显的功能,应该包含在库中.
在本教程之后,我尝试在Ubuntu 16.04上使用Python安装OpenCV 3.
在进入的步骤 $ sudo apt-get install libjpeg8-dev libtiff4-dev libjasper-dev libpng12-dev
我收到了这条消息:
Reading package lists... Done
Building dependency tree
Reading state information... Done
Package libtiff4-dev is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
However the following packages replace it:
libtiff5-dev:i386 libtiff5-dev
E: Package 'libtiff4-dev' has no installation candidate
Run Code Online (Sandbox Code Playgroud)
这是因为我使用的是Ubuntu的最新LTS版本(作者使用的是Ubuntu 14.04)?如果我只是安装libtiff5-dev(我的意思是,它会影响我将从现在开始构建的OpenCV操作)吗?
我想要更多地了解图像,而且我遇到了很多麻烦.从使用matlab,我有使用imread('test.tif')的经验,并获得一个漂亮的行与列的矩阵,其中每个像素的强度为整数.因此,720 x 250图像将提供720 x 250矩阵,其中每个单元格包含像素的强度,范围为0-255(取决于数据类型).所以,0是黑色,255是白色.
它非常简单,非常有意义.现在我试图使用libtiff,我真的很挣扎.我想做同样的事情 - 访问那些像素,我只是无法得到它.
我有以下代码:
int main(int argc, char *argv[]){
TIFF* tif = TIFFOpen( argv[1], "r");
FILE *fp = fopen("test2.txt", "w+");
if (tif) {
int * buf;
tstrip_t strip;
uint32* bc;
uint32 stripsize;
TIFFGetField( tif, TIFFTAG_STRIPBYTECOUNTS, &bc);
stripsize = bc[0];
buf = _TIFFmalloc(stripsize);
for(strip = 0; strip < TIFFNumberOfStrips(tif); strip++ ) {
if( bc[strip] > stripsize) {
buf = _TIFFrealloc(buf, bc[strip]);
stripsize = bc[strip];
}
TIFFReadRawStrip(tif, strip, buf, bc[strip]);
}
int i;
for (i=0; i<stripsize; i++) …
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个多页 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 秒 …