TIFF 图像数据提取与处理 tiff数据 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 tiff中的strip就是1~n行scanline根据头中定义的压缩算法压缩而成的,如果没有定义strip包含几行,那么认为每个strip就是一行scanline数据。 我使用的图像属性是:压缩码 == 1 :未压缩长:1710宽:1510位深:1611 01 04 00 AC 01 00 00 4C DA 4E 00 273 *图像Strip偏移量0x4EDA4C每个条状数据在文件中的偏移量 17 01 04 00 AC 01 00 00 9C D3 4E 00 279 每个条状数据在文件中的字节数(0x01AC)428*4=1712字节 15 01 03 00 01 00 00 00 01 00 00 00 277 每像素的取样数 1:表示是黑白,灰度 16 01 04 00 01 00 00 00 04 00 00 00 278 每个Strip中的行数 4 1A 01 05 00 01 00 00 00 B0 CF 4E 00 282 x分辨率 300 1B 01 05 00 01 00 00 00 B8 CF 4E 00 283 y分辨率 300这个是说我的这个图片中有4个Scanline,那么我去数据就直接从偏移地址0x4EDA4C开始读取,读取长度为1712字节*4条扫描行,是这样吗?我看资料说,Sanline之间的排列是无序的,不是安装正序或者倒叙排列的,那么第一个扫面行的地址知道了,其他3个的地址是多少?在哪里看呢?感谢指导 Orientation(code 274 -- 0x0112)标记不是指明了原点位置吗? 也就是第一条scanline的位置和方向?后续strip只是按这个方向连续而已。然后PlanarConfiguration(code 284-- 0x011C)又指明了每像素颜色是混合在一起即scanline中每像素都包含rgb component还是分开每种颜色一层--即scanline中只包含一个颜色连续像素然后另一种颜色连续像素。 没有你提到的2中属性。这个是我的灰度图像属性。看了你的回答,我的理解是,我可以直接从条带偏移(Tag = 273)处开始读取数据,每次读取(Tag = 279)个字节。 需要读取(Tag=278)次,是这样吗?可是我还是觉得不太对啊。 原始图像 下载链接:http://pan.baidu.com/s/1c02C2Xy 根据258和277来看,每个pixel是一个word宽的灰度值,也就是说图片中每像素2字节。那么scanline的宽度就是图片宽度*2 = 3020字节。根据273来看你图片中包含了428个strip,第一个strip开始于0x4EDA4C。根据279来看每个strip包含4个scanline,那么图片总共可以有1712条scanline但是图片高度只有1710,所以最后一个strip只包含2条scanline. 因为你的strip没有压缩,那么你可以直接从0x4EDA4C处开始读,每3020字节一条scanline(1510像素 )*1710条scanline = 5164200字节 约4.9M图片数据 下午突然脑子开窍了,确实如你所说。只是“第一个strip开始于0x4EDA4C”应该是“第一个strip的偏移地址开始于0x4EDA4C”呵呵我使用winhex查看图像数据,根据条带偏移和条带长度进行计算,发现图像中有一些数据是没被使用的,这个是正常的吗?还是所有的数据都会被用上,我有遗漏? 你的tiff中包含了DocumentName这个Extension Tag和5个private tags(应该是扫描设备记录的内部信息),没用到的数据应该是这些tag指向的数据。 先把图像加载到图像控件行吗?这样可以从图像控件中提取 IMAGE,然后在上面进行图像数据读取,就很简单了,与格式无关。具体方法可以在我的资源里找 与格式无关?那么对于灰度图像计算灰度值有影响吗?按照你的意思,是直接在显示图像的控件中获取像素点的RGB值,然后直接求灰度值就行了吗?不需要用到源图像数据? 我处理的是16位的灰度图像,直接通过控件获取RGB值然后得到的灰度值是不准确的。有好的建议吗?谢谢 我处理的是16位的灰度图像,直接通过控件获取RGB值然后得到的灰度值是不准确的。有好的建议吗?谢谢这样做的好处是控件可以打开的所有图像格式都可以用一个方法来读数据,问题是所有的数据都会读成RGB,可能造成不必要的空间浪费。我还真没遇到到数据不准确的问题,你可以试一下先。如果发现不准确的问题告诉我 我处理的是16位的灰度图像,直接通过控件获取RGB值然后得到的灰度值是不准确的。有好的建议吗?谢谢这样做的好处是控件可以打开的所有图像格式都可以用一个方法来读数据,问题是所有的数据都会读成RGB,可能造成不必要的空间浪费。我还真没遇到到数据不准确的问题,你可以试一下先。如果发现不准确的问题告诉我这个是使用CXimage开源类把tiff图像显示到控件的,我需要计算这个灰度图像中某些像素点的灰度值,但是因为是显示在控件中的,而且CXimage对tiff 16位深图像不支持,被强转为8位了。现在直接用的CXimage中的函数得到灰度值,但是这个值需要<<8(左移8位)才能跟16位时该点的灰度值差不多(还是有点差距的)。而通过你提到的直接在控件上获取该点的RGB值,得到的R=G=B(这3个值相等)。通过float gray = 0.3*r+0.59*g+0.11*b;方法转换为灰度值,结果也是有点差距。因为R=G=B,所以float gray = 0.3*r+0.59*g+0.11*b;无具体效果。所以呢,我现在是想自己来去读tiff源数据,现在已经能把数据按照条带读取出来了,只是现在不知道该怎么把这个数据转化为图像在控件中显示。据我所知需要把这个数据转换成bitmap来显示才行。正在研究这方面资料。还一个我想问的是,得到tiff源数据,怎么把某一像素点的值转换成灰度值呢?条带中的数据每个像素点占用16个字节,是说从0开始,前16个字节就是改行的第一个像素点吗?然后依次向后排列?如果是,那么5E 01 4A 02 3C 03 47 02 DD 02 2B 02 C6 01 E7 02 (这个是第一个条带的前16个字节)怎么转换成灰度值呢?感谢解惑。 因为16位灰度值最大可以是65536而8位灰度值最大是256.所以需要<<8 ( 256<<8 == 65536 )方便的话可以加我QQ吗?三四五零六二六零九 不是0x015E就是0x5E01或调色板中对应的色彩。 我这个是TIFF格式的,里面没有调色板。5E 01 4A 02 3C 03 47 02 DD 02 2B 02 C6 01 E7 02这个直接就是winhex打开之后看到的图像数据。 你的意思是,灰度值直接就是0x015E? 如何禁止用户删除受保护文件? 如何理解CScrollView中的滚动条及视图处理,请各位帮忙解答几个小问题 我需要大量的图片处理的例子,谁有发到我邮箱,100分按数量散分! 诚征学习例子,帮助顶者有分。 请教一个简单画图问题!!!!!! >>>哪里有VisualStudio6和MSDN下载??? 关于VC安装的问题,:尚未安装成功 高手们请帮我找找错,一个下载文件的问题 怎么用VC调用SPEECH SDK实现中文朗读? 求OpenGL大牛 话说一个很强大的代码管理工具 SVN+SSH组合问题 MFC View问题!急急急!
压缩码 == 1 :未压缩
长:1710
宽:1510
位深:16
11 01 04 00 AC 01 00 00 4C DA 4E 00 273 *图像Strip偏移量0x4EDA4C每个条状数据在文件中的偏移量
17 01 04 00 AC 01 00 00 9C D3 4E 00 279 每个条状数据在文件中的字节数(0x01AC)428*4=1712字节
15 01 03 00 01 00 00 00 01 00 00 00 277 每像素的取样数 1:表示是黑白,灰度
16 01 04 00 01 00 00 00 04 00 00 00 278 每个Strip中的行数 4
1A 01 05 00 01 00 00 00 B0 CF 4E 00 282 x分辨率 300
1B 01 05 00 01 00 00 00 B8 CF 4E 00 283 y分辨率 300这个是说我的这个图片中有4个Scanline,那么我去数据就直接从偏移地址0x4EDA4C开始读取,读取长度为1712字节*4条扫描行,是这样吗?我看资料说,Sanline之间的排列是无序的,不是安装正序或者倒叙排列的,那么第一个扫面行的地址知道了,其他3个的地址是多少?在哪里看呢?
感谢指导
然后PlanarConfiguration(code 284-- 0x011C)又指明了每像素颜色是混合在一起即scanline中每像素都包含rgb component还是分开每种颜色一层--即scanline中只包含一个颜色连续像素然后另一种颜色连续像素。
没有你提到的2中属性。
这个是我的灰度图像属性。
看了你的回答,我的理解是,我可以直接从条带偏移(Tag = 273)处开始读取数据,每次读取(Tag = 279)个字节。 需要读取(Tag=278)次,是这样吗?
可是我还是觉得不太对啊。
根据273来看你图片中包含了428个strip,第一个strip开始于0x4EDA4C。根据279来看每个strip包含4个scanline,那么图片总共可以有1712条scanline但是图片高度只有1710,所以最后一个strip只包含2条scanline. 因为你的strip没有压缩,那么你可以直接从0x4EDA4C处开始读,每3020字节一条scanline(1510像素 )*1710条scanline = 5164200字节 约4.9M图片数据
只是“第一个strip开始于0x4EDA4C”应该是“第一个strip的偏移地址开始于0x4EDA4C”呵呵
我使用winhex查看图像数据,根据条带偏移和条带长度进行计算,发现图像中有一些数据是没被使用的,这个是正常的吗?还是所有的数据都会被用上,我有遗漏?
与格式无关?
那么对于灰度图像计算灰度值有影响吗?
按照你的意思,是直接在显示图像的控件中获取像素点的RGB值,然后直接求灰度值就行了吗?不需要用到源图像数据?
我处理的是16位的灰度图像,直接通过控件获取RGB值然后得到的灰度值是不准确的。
有好的建议吗?谢谢
我处理的是16位的灰度图像,直接通过控件获取RGB值然后得到的灰度值是不准确的。
有好的建议吗?谢谢
这样做的好处是控件可以打开的所有图像格式都可以用一个方法来读数据,问题是所有的数据都会读成RGB,可能造成不必要的空间浪费。我还真没遇到到数据不准确的问题,你可以试一下先。如果发现不准确的问题告诉我
我处理的是16位的灰度图像,直接通过控件获取RGB值然后得到的灰度值是不准确的。
有好的建议吗?谢谢
这样做的好处是控件可以打开的所有图像格式都可以用一个方法来读数据,问题是所有的数据都会读成RGB,可能造成不必要的空间浪费。我还真没遇到到数据不准确的问题,你可以试一下先。如果发现不准确的问题告诉我这个是使用CXimage开源类把tiff图像显示到控件的,我需要计算这个灰度图像中某些像素点的灰度值,
但是因为是显示在控件中的,而且CXimage对tiff 16位深图像不支持,被强转为8位了。现在直接用的CXimage中的函数得到灰度值,但是这个值需要<<8(左移8位)才能跟16位时该点的灰度值差不多(还是有点差距的)。而通过你提到的直接在控件上获取该点的RGB值,得到的R=G=B(这3个值相等)。通过float gray = 0.3*r+0.59*g+0.11*b;方法转换为灰度值,结果也是有点差距。因为R=G=B,所以float gray = 0.3*r+0.59*g+0.11*b;无具体效果。所以呢,我现在是想自己来去读tiff源数据,现在已经能把数据按照条带读取出来了,只是现在不知道该怎么把这个数据转化为图像在控件中显示。据我所知需要把这个数据转换成bitmap来显示才行。正在研究这方面资料。还一个我想问的是,得到tiff源数据,怎么把某一像素点的值转换成灰度值呢?
条带中的数据每个像素点占用16个字节,是说从0开始,前16个字节就是改行的第一个像素点吗?然后依次向后排列?
如果是,那么5E 01 4A 02 3C 03 47 02 DD 02 2B 02 C6 01 E7 02 (这个是第一个条带的前16个字节)怎么转换成灰度值呢?
感谢解惑。
而8位灰度值最大是256.
所以需要<<8 ( 256<<8 == 65536 )方便的话可以加我QQ吗?三四五零六二六零九
5E 01 4A 02 3C 03 47 02 DD 02 2B 02 C6 01 E7 02
这个直接就是winhex打开之后看到的图像数据。
你的意思是,灰度值直接就是0x015E?