解决方案 »

  1.   

    tiff中的strip就是1~n行scanline根据头中定义的压缩算法压缩而成的,如果没有定义strip包含几行,那么认为每个strip就是一行scanline数据。
      

  2.   

    我使用的图像属性是:
    压缩码 == 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个的地址是多少?在哪里看呢?
    感谢指导
      

  3.   

    Orientation(code 274 -- 0x0112)标记不是指明了原点位置吗? 也就是第一条scanline的位置和方向?后续strip只是按这个方向连续而已。
    然后PlanarConfiguration(code 284-- 0x011C)又指明了每像素颜色是混合在一起即scanline中每像素都包含rgb component还是分开每种颜色一层--即scanline中只包含一个颜色连续像素然后另一种颜色连续像素。
      

  4.   


    没有你提到的2中属性。
    这个是我的灰度图像属性。
    看了你的回答,我的理解是,我可以直接从条带偏移(Tag = 273)处开始读取数据,每次读取(Tag = 279)个字节。 需要读取(Tag=278)次,是这样吗?
    可是我还是觉得不太对啊。
      

  5.   

    原始图像 下载链接:http://pan.baidu.com/s/1c02C2Xy
      

  6.   

    根据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图片数据
      

  7.   

    下午突然脑子开窍了,确实如你所说。
    只是“第一个strip开始于0x4EDA4C”应该是“第一个strip的偏移地址开始于0x4EDA4C”呵呵
    我使用winhex查看图像数据,根据条带偏移和条带长度进行计算,发现图像中有一些数据是没被使用的,这个是正常的吗?还是所有的数据都会被用上,我有遗漏?
      

  8.   

    你的tiff中包含了DocumentName这个Extension Tag和5个private tags(应该是扫描设备记录的内部信息),没用到的数据应该是这些tag指向的数据。
      

  9.   

    先把图像加载到图像控件行吗?这样可以从图像控件中提取 IMAGE,然后在上面进行图像数据读取,就很简单了,与格式无关。具体方法可以在我的资源里找
      

  10.   


    与格式无关?
    那么对于灰度图像计算灰度值有影响吗?
    按照你的意思,是直接在显示图像的控件中获取像素点的RGB值,然后直接求灰度值就行了吗?不需要用到源图像数据?
      

  11.   


    我处理的是16位的灰度图像,直接通过控件获取RGB值然后得到的灰度值是不准确的。
    有好的建议吗?谢谢
      

  12.   


    我处理的是16位的灰度图像,直接通过控件获取RGB值然后得到的灰度值是不准确的。
    有好的建议吗?谢谢
    这样做的好处是控件可以打开的所有图像格式都可以用一个方法来读数据,问题是所有的数据都会读成RGB,可能造成不必要的空间浪费。我还真没遇到到数据不准确的问题,你可以试一下先。如果发现不准确的问题告诉我
      

  13.   


    我处理的是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个字节)怎么转换成灰度值呢?
    感谢解惑。
      

  14.   

    因为16位灰度值最大可以是65536
    而8位灰度值最大是256.
    所以需要<<8  ( 256<<8 == 65536 )方便的话可以加我QQ吗?三四五零六二六零九
      

  15.   

    不是0x015E就是0x5E01或调色板中对应的色彩。
      

  16.   

    我这个是TIFF格式的,里面没有调色板。
    5E 01 4A 02 3C 03 47 02 DD 02 2B 02 C6 01 E7 02
    这个直接就是winhex打开之后看到的图像数据。
     
    你的意思是,灰度值直接就是0x015E?