首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

c++操作写入tiff文件时怎么设置每一个Strip大小

2013-12-28 
c++操作写入tiff文件时如何设置每一个Strip大小我从一个tiff文件中读取了像素块,想自己编写代码把像素块写

c++操作写入tiff文件时如何设置每一个Strip大小
我从一个tiff文件中读取了像素块,想自己编写代码把像素块写入到一个新的tiff文件中,但是写入后图像显示不完全,有的地方被黑色覆盖。查找后发现每个Strip块的大小与原文件不同。请问Strip块的大小该如何设置。
这是我设置Strip块大小的代码

m_ScripRows = 8 * 1024;//RowsPerStrip
    if(m_PlanarConfig == 1)
    {
        m_ScriptCount = floor((double)(m_SizeDoc.cy + m_ScripRows - 1) / m_ScripRows);//stripCount
    }
    else
    {
        m_ScriptCount = floor((double)(m_SizeDoc.cy + m_ScripRows - 1) / m_ScripRows) * m_SamplesPerPixel;
    }
    int PerScripByte = m_PixSize / m_ScriptCount;
    int LastScripByte = 0;
    if(m_PixSize % m_ScriptCount == 0)//m_PixSize像素点总大小
    {
        LastScripByte = PerScripByte;
    }
    else
    {
        LastScripByte = PerScripByte + (m_PixSize % m_ScriptCount);
    }
    delete[] m_ScripArr;//存放Strip的OffSet
    delete[] m_ScripBytes;//存放Strip大小
    if(m_ScriptCount != 0)
    {
        m_ScripArr = new int[m_ScriptCount];
        m_ScripBytes = new int[m_ScriptCount];
        //m_ScripArr[0] = 0x0008;
        //int tmp[470];
        if(m_ScriptCount >= 1)
        {
            for(int i = 0; i < m_ScriptCount - 1; i++)
            {
                m_ScripBytes[i] = PerScripByte;
                m_ScripArr[i] = 0x0008 + i* PerScripByte;
            }
            m_ScripArr[m_ScriptCount - 1] = 8 + (m_ScriptCount - 1)* PerScripByte;
            m_ScripBytes[m_ScriptCount - 1] = LastScripByte;
        }
    }
}

[解决办法]
TIFF 文档 
搜一下 
Tiff Revision 6.0

我看了一下Tiff Revision 6.0
1)下面这个,和数据对齐有关

压缩方案  用于对图像数据压缩方案。 标号=259 (103.H) 类型=SHORT  N =1  1=没有压缩,但是字节中的数据包会尽可能的紧密,只在一行的结 尾可能有没用比特。    如果       样点值按以下类型的数组存储  样点位数=16对于所有样点   SHORT 样点位数=32对于所有样点     LONG 
其它         BYTE    第一行都会填充到下一个字节的边界,符合前面的字节填充规则。    如果图像数据以SHORT或LONG类型数组存储,字节顺序必须和TIFF头文件第0,1字节指明的字节顺序相符。因此,小字字节顺序类型的文件的最小权值的字节在最大权值字节的前面,而大字字节顺序的文件有相反的顺序。  如果每个成份的比特数不是2的幂,而且你愿意放弃一些字段来获得更好的性能,用稍大的2的幂。例如,如果你的数据能用六比特表示,把样点位数设为8而不是6,进而把值的范围从[0,63]转换到[0,255]。    行必须开始于字节边界。(SHORT型边界如果数据以SHORT类型存储,LONG型边界如果数据以LONG类型存储)。 一些图形系统要求图像数据的行字对齐或双字对齐,而且填充到字边界或双字边界。非压缩TIFF数据行在被传递到这些环境中的图形程序之前须要拷贝到字对齐或双字对齐的行中缓存行中。    2= CCITT组3 1维改良霍夫曼运行长度编码。见第10节。每样本位数  必须是1 ,因为这种类型的压缩被定义的只有二层图像。    32773= PACKBITS压缩,一个简单的面向字节的运行长度的计划。见第9节   了解详情。数据压缩仅应用于图像数据,由条带偏移量指向。    缺省值=1。
2)TIFF 头的字节顺序字段必须为 II或者MM
文件的开始两个字字节,就是字节顺序字段
II代表Intel
MM代表 。。Motorola? Mac?
这个记不住了,他的字节顺序和Intel相反。

曾经用过一个软件,字节顺序为MM的识别错误。
结果图形显示出错,用该软件打印输出的结果,也是错误的。
在Photoshop 中修改为字节顺序为II,另存一下,然后就可以正确显示,和打印了。
PS:
TIFF 支持Intel和非Intel字节顺序中的 任意一个
所以文件头的字节顺序字段,一定不能忽略。

其实微软的BMP似乎也支持非Intel字节顺序,只要开头两个字节BM 改为MB 就可以了,其他内容按照字节顺序解码即可。 

热点排行