我正在尝试创建一个(640*360)的灰度Tiff图像,但是在某个点上指针指向了一个错误的位置,也许有人可以告诉我我的代码出了什么问题。该映像是在执行结束时创建的,但大小为0 KB且已损坏。
如果有任何关于打开和处理二进制文件的建议,我将不胜感激。
#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;
};发布于 2018-02-26 15:41:08
您面临的问题可能是由ofstream::ofstream引起的:此构造函数等待const char*作为第一个参数,因此请编写:
std::string filename = "Result.tiff";
std::ofstream tiffstream(filename.c_str(), std::ios::binary);//open the file或
std::ofstream tiffstream("Result.tiff", std::ios::binary);//open the file来防止这个问题。
你应该已经看到了这一点,你编译的时候警告是打开的(-Wall在gcc或者当当)。
此外,您的原始帖子不够完整,无法确保此答案适用于您的问题:忽略TiffHeader是什么,我们不能确定没有另一个问题。
发布于 2018-02-27 22:34:03
我解决了这个问题,只要注意声明的信息,信息被写在worng的地方。代码如下:
#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;
};https://stackoverflow.com/questions/48949048
复制相似问题