首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Tiff文件中创建和插入信息时出现分段错误(核心转储)

在Tiff文件中创建和插入信息时出现分段错误(核心转储)
EN

Stack Overflow用户
提问于 2018-02-23 21:33:03
回答 2查看 81关注 0票数 0

我正在尝试创建一个(640*360)的灰度Tiff图像,但是在某个点上指针指向了一个错误的位置,也许有人可以告诉我我的代码出了什么问题。该映像是在执行结束时创建的,但大小为0 KB且已损坏。

如果有任何关于打开和处理二进制文件的建议,我将不胜感激。

代码语言:javascript
复制
#include "TIFF.h"
#include "TiffImage.h"
#include <string>
#include <iostream>
#include <fstream>

int CTIFF::write(/*std::string origFilename, Hobject Image*/)
{
    std::string filename = "Result.tiff";
    std::ofstream tiffstream(filename, std::ios::binary);//open the file

    TiffHeader tiff_header_image;

    tiff_header_image.ifh.byte_order   = 0x4949; //0x4949 little indian endian OR 0x4D4D big endian
    tiff_header_image.ifh.const_0x002a = 0x002a; //Version number (always 42)
    tiff_header_image.ifh.ifd0_offset  = 0x000a; //offset from beginning of file to 'ifd0_num_entries'

    tiff_header_image.ifd0[IFD0_INDEX_IMAGEWIDTH].tag      = 0x0100;  // TIFFTAG_IMAGEWIDTH
    tiff_header_image.ifd0[IFD0_INDEX_IMAGEWIDTH].typ      = 0x0004;  // TIFFTYPE_LONG
    tiff_header_image.ifd0[IFD0_INDEX_IMAGEWIDTH].count    = 0x0001;
    tiff_header_image.ifd0[IFD0_INDEX_IMAGEWIDTH].value    = 640;

    tiff_header_image.ifd0[IFD0_INDEX_IMAGELENGTH].tag     = 0x0101;  // TIFFTAG_IMAGELENGTH
    tiff_header_image.ifd0[IFD0_INDEX_IMAGELENGTH].typ     = 0x0004;  // TIFFTYPE_LONG
    tiff_header_image.ifd0[IFD0_INDEX_IMAGELENGTH].count   = 0x0001;
    tiff_header_image.ifd0[IFD0_INDEX_IMAGELENGTH].value   = 360;

    tiff_header_image.ifd0[IFD0_INDEX_BITSPERSAMPLE].tag   = 0x0102;  // TIFFTAG_BITSPERSAMPLE
    tiff_header_image.ifd0[IFD0_INDEX_BITSPERSAMPLE].typ   = 0x0003;  // TIFFTYPE_SHORT
    tiff_header_image.ifd0[IFD0_INDEX_BITSPERSAMPLE].count = 0x0001;
    tiff_header_image.ifd0[IFD0_INDEX_BITSPERSAMPLE].value = 8;

    tiff_header_image.ifd0[IFD0_INDEX_STRIPOFFSETS].tag    = 0x0111;  // TIFFTAG_STRIPOFFSETS
    tiff_header_image.ifd0[IFD0_INDEX_STRIPOFFSETS].typ    = 0x0004;  // TIFFTYPE_LONG
    tiff_header_image.ifd0[IFD0_INDEX_STRIPOFFSETS].count  = 0x0001;
    tiff_header_image.ifd0[IFD0_INDEX_STRIPOFFSETS].value  = 1;       // "BlackIsZero"

    tiff_header_image.ifd0[IFD0_INDEX_STRIPBYTECOUNTS].tag   = 0x0117;  // TIFFTAG_STRIPBYTECOUNTS
    tiff_header_image.ifd0[IFD0_INDEX_STRIPBYTECOUNTS].typ   = 0x0004;  // TIFFTYPE_LONG
    tiff_header_image.ifd0[IFD0_INDEX_STRIPBYTECOUNTS].count = 0x0001;
    tiff_header_image.ifd0[IFD0_INDEX_STRIPBYTECOUNTS].value = 230400;  //width x length

    tiff_header_image.ifd0_x_resolution.numerator   = 0x00000008; // 8 [cm / pixel] 
    tiff_header_image.ifd0_x_resolution.denominator = 0x00002710; // 10000 = 8 [um / pixel]

    tiff_header_image.ifd0_y_resolution.numerator   = 0x00000008; // 8 [cm / pixel] 
    tiff_header_image.ifd0_y_resolution.denominator = 0x00002710; // 10000 = 8 [um / pixel]

    tiff_header_image.exif_ifd[EXIFIFD_NUM_ENTRIES].tag     = 0x8769;  // EXIFTAG_EXPOSURE
    tiff_header_image.exif_ifd[EXIFIFD_NUM_ENTRIES].typ     = 0x0005;  // TIFFTYPE_RATIONAL
    tiff_header_image.exif_ifd[EXIFIFD_NUM_ENTRIES].count   = 0x0001;
    tiff_header_image.exif_ifd[EXIFIFD_NUM_ENTRIES].value   = 0x00FE;  // offset to 'exif_ifd_exposure_time'

    tiff_header_image.exif_ifd[EXIFIFD_SUBSETIME_STRLEN].tag   = 0x8769;  // EXIFTAG_SUBSECTIME
    tiff_header_image.exif_ifd[EXIFIFD_SUBSETIME_STRLEN].typ   = 0x0002;  // TIFFTYPE_ASCII
    tiff_header_image.exif_ifd[EXIFIFD_SUBSETIME_STRLEN].count = 0x000a;  // 10 bytes: 9 decimals + '\0'
    tiff_header_image.exif_ifd[EXIFIFD_SUBSETIME_STRLEN].value = 0x0108;  // offset to 'exif_ifd_subsec_time'

    tiff_header_image.exif_ifd_exposure_time.numerator   = 0x00000000;  // exposure-time in [usec]
    tiff_header_image.exif_ifd_exposure_time.denominator = 0x000F4240;  // 1000000 -> numerator in micro-seconds

    if (tiffstream.is_open())
    {
        tiffstream.write(reinterpret_cast<const char*>(&tiff_header_image), sizeof(tiff_header_image));

        int   width  = 640;
        int   height = 360;

        unsigned char pixelValue = 128; //gray
        for (int r = 0; r < height; r++)
            for (int c = 0; c < width; c++)
            {
                tiffstream.write(reinterpret_cast<const char*>(&pixelValue), sizeof(unsigned char));
            }
        std::cout << "Output operation successfully performed\n";
        tiffstream.close();

    }
    else
    {
        std::cout << "Error opening file";
    }
    return 0;
};
EN

回答 2

Stack Overflow用户

发布于 2018-02-26 15:41:08

您面临的问题可能是由ofstream::ofstream引起的:此构造函数等待const char*作为第一个参数,因此请编写:

代码语言:javascript
复制
std::string filename = "Result.tiff";
std::ofstream tiffstream(filename.c_str(), std::ios::binary);//open the file

代码语言:javascript
复制
std::ofstream tiffstream("Result.tiff", std::ios::binary);//open the file

来防止这个问题。

你应该已经看到了这一点,你编译的时候警告是打开的(-Wall在gcc或者当当)。

此外,您的原始帖子不够完整,无法确保此答案适用于您的问题:忽略TiffHeader是什么,我们不能确定没有另一个问题。

票数 0
EN

Stack Overflow用户

发布于 2018-02-27 22:34:03

我解决了这个问题,只要注意声明的信息,信息被写在worng的地方。代码如下:

代码语言:javascript
复制
#include "TIFF.h"
#include "TiffImage.h"
#include <string>
#include <iostream>
#include <fstream>

std::wstring s2ws(const std::string& s);

int CTIFF::write(/*std::string origFilename Hobject Image*/)
{


  std::string filename = "Result.tiff";

    std::ofstream tiffstream(filename, std::ios::binary);//open the file

    TiffHeader tiff_header_image;

    tiff_header_image.ifh.byte_order   = 0x4949; //0x4949 little indian endian OR 0x4D4D big endian
    tiff_header_image.ifh.const_0x002a = 0x002a; //Version number (always 42)
    tiff_header_image.ifh.ifd0_offset  = 0x000a; //offset from beginning of file to 'ifd0_num_entries'

    tiff_header_image.ifd0_num_entries = 14;

    tiff_header_image.ifd0[IFD0_INDEX_IMAGEWIDTH].tag      = 0x0100;  // TIFFTAG_IMAGEWIDTH
    tiff_header_image.ifd0[IFD0_INDEX_IMAGEWIDTH].typ      = 0x0004;  // TIFFTYPE_LONG
    tiff_header_image.ifd0[IFD0_INDEX_IMAGEWIDTH].count    = 0x0001;
    tiff_header_image.ifd0[IFD0_INDEX_IMAGEWIDTH].value    = 640;

    tiff_header_image.ifd0[IFD0_INDEX_IMAGELENGTH].tag     = 0x0101;  // TIFFTAG_IMAGELENGTH
    tiff_header_image.ifd0[IFD0_INDEX_IMAGELENGTH].typ     = 0x0004;  // TIFFTYPE_LONG
    tiff_header_image.ifd0[IFD0_INDEX_IMAGELENGTH].count   = 0x0001;
    tiff_header_image.ifd0[IFD0_INDEX_IMAGELENGTH].value   = 360;

    tiff_header_image.ifd0[IFD0_INDEX_BITSPERSAMPLE].tag   = 0x0102;  // TIFFTAG_BITSPERSAMPLE
    tiff_header_image.ifd0[IFD0_INDEX_BITSPERSAMPLE].typ   = 0x0003;  // TIFFTYPE_SHORT
    tiff_header_image.ifd0[IFD0_INDEX_BITSPERSAMPLE].count = 0x0001;
    tiff_header_image.ifd0[IFD0_INDEX_BITSPERSAMPLE].value = 8;

    tiff_header_image.ifd0[IFD0_INDEX_COMPRESSION].tag   = 0x0103;  // TIFFTAG_COMPRESSION
tiff_header_image.ifd0[IFD0_INDEX_COMPRESSION].typ   = 0x0003;  // TIFFTYPE_SHORT
tiff_header_image.ifd0[IFD0_INDEX_COMPRESSION].count = 0x0001;
tiff_header_image.ifd0[IFD0_INDEX_COMPRESSION].value = 1;       // "No compression"

tiff_header_image.ifd0[IFD0_INDEX_PHOTOMETRICINTERPRETATION].tag   = 0x0106;  // TIFFTAG_PHOTOMETRIC
tiff_header_image.ifd0[IFD0_INDEX_PHOTOMETRICINTERPRETATION].typ   = 0x0003;  // TIFFTYPE_SHORT
tiff_header_image.ifd0[IFD0_INDEX_PHOTOMETRICINTERPRETATION].count = 0x0001;
tiff_header_image.ifd0[IFD0_INDEX_PHOTOMETRICINTERPRETATION].value = 1;       // "BlackIsZero"

tiff_header_image.ifd0[IFD0_INDEX_STRIPOFFSETS].tag   = 0x0111;  // TIFFTAG_STRIPOFFSETS
tiff_header_image.ifd0[IFD0_INDEX_STRIPOFFSETS].typ   = 0x0004;  // TIFFTYPE_LONG
tiff_header_image.ifd0[IFD0_INDEX_STRIPOFFSETS].count = 0x0001;
tiff_header_image.ifd0[IFD0_INDEX_STRIPOFFSETS].value = 0x0110;  // offset to image data from beginning of file

tiff_header_image.ifd0[IFD0_INDEX_SAMPLESPERPIXEL].tag   = 0x0115;  // TIFFTAG_SAMPLESPERPIXEL
tiff_header_image.ifd0[IFD0_INDEX_SAMPLESPERPIXEL].typ   = 0x0003;  // TIFFTYPE_SHORT
tiff_header_image.ifd0[IFD0_INDEX_SAMPLESPERPIXEL].count = 0x0001;
tiff_header_image.ifd0[IFD0_INDEX_SAMPLESPERPIXEL].value = 1;

    tiff_header_image.ifd0[IFD0_INDEX_ROWSPERSTRIP].tag   = 0x0116;  // TIFFTAG_ROWSPERSTRIP
    tiff_header_image.ifd0[IFD0_INDEX_ROWSPERSTRIP].typ   = 0x0004;  // TIFFTYPE_LONG
    tiff_header_image.ifd0[IFD0_INDEX_ROWSPERSTRIP].count = 0x0001;
    tiff_header_image.ifd0[IFD0_INDEX_ROWSPERSTRIP].value = 360;      // same as TIFFTAG_IMAGELENGTH, usually 360

    tiff_header_image.ifd0[IFD0_INDEX_STRIPBYTECOUNTS].tag   = 0x0117;  // TIFFTAG_STRIPBYTECOUNTS
    tiff_header_image.ifd0[IFD0_INDEX_STRIPBYTECOUNTS].typ   = 0x0004;  // TIFFTYPE_LONG
    tiff_header_image.ifd0[IFD0_INDEX_STRIPBYTECOUNTS].count = 0x0001;
    tiff_header_image.ifd0[IFD0_INDEX_STRIPBYTECOUNTS].value = 230400;  //width x length

    tiff_header_image.ifd0[IFD0_INDEX_XRESOLUTION].tag   = 0x011a;  // TIFFTAG_XRESOLUTION
    tiff_header_image.ifd0[IFD0_INDEX_XRESOLUTION].typ   = 0x0005;  // TIFFTYPE_RATIONAL
    tiff_header_image.ifd0[IFD0_INDEX_XRESOLUTION].count = 0x0001;
    tiff_header_image.ifd0[IFD0_INDEX_XRESOLUTION].value = 0x00CC; // offset to 'ifd0_x_resolution'

    tiff_header_image.ifd0[IFD0_INDEX_YRESOLUTION].tag   = 0x011b;  // TIFFTAG_XRESOLUTION
    tiff_header_image.ifd0[IFD0_INDEX_YRESOLUTION].typ   = 0x0005;  // TIFFTYPE_RATIONAL
    tiff_header_image.ifd0[IFD0_INDEX_YRESOLUTION].count = 0x0001;
    tiff_header_image.ifd0[IFD0_INDEX_YRESOLUTION].value = 0x00D4;  // offset to 'ifd0_y_resolution'

    tiff_header_image.ifd0[IFD0_INDEX_RESOLUTIONUNIT].tag   = 0x0128;  // TIFFTAG_RESOLUTIONUNIT
    tiff_header_image.ifd0[IFD0_INDEX_RESOLUTIONUNIT].typ   = 0x0003;  // TIFFTYPE_SHORT
    tiff_header_image.ifd0[IFD0_INDEX_RESOLUTIONUNIT].count = 0x0001;
    tiff_header_image.ifd0[IFD0_INDEX_RESOLUTIONUNIT].value = 3;       // "Centimeter"

    tiff_header_image.ifd0[IFD0_INDEX_DATE_TIME].tag   = 0x0132;  // TIFFTAG_DATETIME
    tiff_header_image.ifd0[IFD0_INDEX_DATE_TIME].typ   = 0x0002;  // TIFFTYPE_ASCII
    tiff_header_image.ifd0[IFD0_INDEX_DATE_TIME].count = 0x0014;  // 20 bytes string, format: "YYYY:MM:DD HH:MM:SS"
    tiff_header_image.ifd0[IFD0_INDEX_DATE_TIME].value = 0x00B8;  // offset to 'ifd0_date_time'

    tiff_header_image.ifd0[IFD0_INDEX_EXIFIFD].tag   = 0x8769;  // TIFFTAG_EXIFIFD
    tiff_header_image.ifd0[IFD0_INDEX_EXIFIFD].typ   = 0x0004;  // TIFFTYPE_LONG
    tiff_header_image.ifd0[IFD0_INDEX_EXIFIFD].count = 0x0001;
    tiff_header_image.ifd0[IFD0_INDEX_EXIFIFD].value = 0x00DC;  // offset to 'exif_ifd_num_entries'

    tiff_header_image.ifd0_next_offset = 0; 

    tiff_header_image.ifd0_x_resolution.numerator   = 0x00000008; // 8 [cm / pixel] 
    tiff_header_image.ifd0_x_resolution.denominator = 0x00002710; // 10000 = 8 [um / pixel]

    tiff_header_image.ifd0_y_resolution.numerator   = 0x00000008; // 8 [cm / pixel] 
    tiff_header_image.ifd0_y_resolution.denominator = 0x00002710; // 10000 = 8 [um / pixel]

    tiff_header_image.exif_ifd_num_entries = 2; 

    tiff_header_image.exif_ifd[0].tag     = 0x8769;  // EXIFTAG_EXPOSURE
  tiff_header_image.exif_ifd[0].typ     = 0x0005;  // TIFFTYPE_RATIONAL
  tiff_header_image.exif_ifd[0].count   = 0x0001;
    tiff_header_image.exif_ifd[0].value   = 0x0102;  // offset to 'exif_ifd_exposure_time'

    tiff_header_image.exif_ifd[0].tag     = 0x9290;  // EXIFTAG_SUBSECTIME
  tiff_header_image.exif_ifd[0].typ     = 0x0002;  // TIFFTYPE_ASCII
  tiff_header_image.exif_ifd[0].count   = 0x000a;  // 10 bytes: 9 decimals + '\0'
    tiff_header_image.exif_ifd[0].value   = 0x010C;  // offset to 'exif_ifd_subsec_time'

    tiff_header_image.exif_ifd_next_offset = 0; 

    tiff_header_image.exif_ifd_exposure_time.numerator   = 0x00000000;  // exposure-time in [usec]
    tiff_header_image.exif_ifd_exposure_time.denominator = 0x000F4240;  // 1000000 -> numerator in micro-seconds

    if(tiffstream.is_open()){

      tiffstream.write(reinterpret_cast<const char*>(&tiff_header_image), sizeof(tiff_header_image));

      int      width  = 640;
      int      height = 360;

      unsigned char pixelValue = 128; //gray
      for (int r = 0; r < height; r++)
        for (int c = 0; c < width; c++){
          tiffstream.write(reinterpret_cast<const char*>(&pixelValue), sizeof(unsigned char));
        }
      std::cout << "Output operation successfully performed\n";
      tiffstream.close();

    }
    else{
      std::cout << "Error opening file";
  }

  return 0;
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48949048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档