임의의 픽셀 배열에서 TIFF/EP 프로파일 2 원시 (.dng) 이미지를 생성하려고합니다. 이 픽셀 배열은 Bayer 패턴 (CFA)을 나타냅니다.Libtiff : TIFF/EP 프로파일 생성 2 픽셀 배열의 Raw 이미지
TIFF/EP 파일 사양을 연구했고 libtiff를 사용하여 완전한 .dng 파일을 생성하는 데 필요한 모든 태그를 포함 시켰습니다. 그러나, 나는 dcraw (dcraw는 파일을 디코딩 할 수 없다는 것을 보여줍니다)로 생성 된 파일을 변환 할 수 없습니다.
하나의 문제는 TIFF/EP 사양에서 필수로 선언되었지만 libtiff에서 구현되지 않은 것으로 보이는 두 개의 태그로 제공 될 수 있습니다. SensingMethod 및 TIFF/EPStandardID 태그. 정말 그들을 포함시켜야합니까 (나는 이러한 태그를 무시하지만 여전히 제대로 작동하는 것으로보고되는 예제 코드를 보았습니다.) 그렇다면 어떻게 수동으로 libtiff에 추가 할 수 있습니까? 또한 SubIFD 태그를 설정하면 "어설 션 실패 : * pa < = 0xFFFFFFFFUL, 파일 tif_dirwrite.c, 줄 1869"오류 메시지가 표시됩니다.
전체적으로 내 문제는이 세 가지 태그 근본적으로 잘못된 것이 있다고 생각합니다. 어쩌면 누군가 내 코드를보고 단서를 줄 수 있을까요? 나는 libtiff의 문서가 다소 가난하다는 말을해야한다. 그래서 내 코드는 거기에있는 몇 안되는 예제 코드 중 하나에 의해 영감을 얻는다 : elphel_dng.c.
대단히 감사합니다! Fabian
추신. 나는이 대답은 아니지만, 코멘트 너무 크고, 너무 제발 ... 해결책을 찾기 위해 도움을 향한 건설적인 입력 Dropbox
C++
#include "tiffio.h"
#include <iostream>
using namespace std;
int main(void)
{
TIFF *tif = TIFFOpen("8bitRaw.dng", "w");
const int sampleperpixel = 1;
const int width = 4;
const int height = 4;
static const short bayerPatternDimensions[] = { 2,2 };
static const double cam_xyz[] = { 2.0413690, -0.5649464, -0.3446944, -0.9692660, 1.8760108, 0.0415560,0.0134474, -0.1183897, 1.0154096 }; //AdobeRGB
static const double neutral[] = { 1.0, 1.0, 1.0 };
long max_white = 255;
long sub_offset = 0;
int row, i;
float gamma = 80;
//Arbitrary Bayer pixel values:
unsigned char image[height][width*sampleperpixel] = {};
image[0][0] = 5; image[0][1] = 165; image[0][2] = 0; image[0][3] = 255;
image[1][0] = 0; image[1][1] = 21; image[1][2] = 0; image[1][3] = 10;
image[2][0] = 0; image[2][1] = 0; image[2][2] = 30; image[2][3] = 5;
image[3][0] = 21; image[3][1] = 120; image[3][2] = 1; image[3][3] = 254;
//Black Thumbnail pixel values:
unsigned char Thumbnail_RGB_Array[] = { 0,0,0,0,0,0,0,0,0,0,0,0 };
//Linearization Table:
unsigned short curve[256];
for (i = 0; i < 256; i++)
curve[i] = 255 * pow(i/255.0, 100.0/gamma) + 0.5;
TIFFSetField(tif, TIFFTAG_SUBFILETYPE, 1);
TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, 4);
TIFFSetField(tif, TIFFTAG_IMAGELENGTH, 4);
TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8);
TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 3);
TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE);
TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB);
TIFFSetField(tif, TIFFTAG_XRESOLUTION, 75.0);
TIFFSetField(tif, TIFFTAG_YRESOLUTION, 75.0);
TIFFSetField(tif, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH);
TIFFSetField(tif, TIFFTAG_MAKE, "DummyMake");
TIFFSetField(tif, TIFFTAG_MODEL, "DummyModel");
TIFFSetField(tif, TIFFTAG_SOFTWARE, "DummySoftware");
TIFFSetField(tif, TIFFTAG_ORIGINALRAWFILENAME, 1, "DummyName.dng");
TIFFSetField(tif, TIFFTAG_UNIQUECAMERAMODEL, "DummyUniqueModel");
TIFFSetField(tif, TIFFTAG_IMAGEDESCRIPTION, "DummyImageDescription");
TIFFSetField(tif, TIFFTAG_COPYRIGHT, "DummyCopyright");
TIFFSetField(tif, TIFFTAG_DATETIME, "2016:06:30 11:11:15");
TIFFSetField(tif, TIFFTAG_DNGVERSION, "\01\01\00\00");
TIFFSetField(tif, TIFFTAG_DNGBACKWARDVERSION, "\01\00\00\00");
TIFFSetField(tif, TIFFTAG_COLORMATRIX1, 9, cam_xyz);
TIFFSetField(tif, TIFFTAG_ASSHOTNEUTRAL, 3, neutral);
TIFFSetField(tif, TIFFTAG_CALIBRATIONILLUMINANT1, 21);
//SensingMethodTag and TIFF/EPStandardID tag: Libtiff doesn't seem to know these:
//TIFFSetField(tif, 37399, 2);
//TIFFSetField(tif, 37398, "\01\01\00\00");
//Yields an error:
//TIFFSetField(tif, TIFFTAG_SUBIFD, 1, &sub_offset);
//Write a black 4x4 pixel dummy thumbnail:
for (row = 0; row < 4 ; row++)
TIFFWriteScanline(tif, Thumbnail_RGB_Array, row, 0);
TIFFWriteDirectory(tif);
//Now write main raw image:
TIFFSetField(tif, TIFFTAG_SUBFILETYPE, 0);
TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, width);
TIFFSetField(tif, TIFFTAG_IMAGELENGTH, height);
TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8);
TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_CFA);
TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1);
TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
TIFFSetField(tif, TIFFTAG_CFAREPEATPATTERNDIM, bayerPatternDimensions);
TIFFSetField(tif, TIFFTAG_CFAPATTERN, "\01\00\02\01");
TIFFSetField(tif, TIFFTAG_CFAPLANECOLOR, 3, "\00\01\02");
TIFFSetField(tif, TIFFTAG_LINEARIZATIONTABLE, 256, curve);
TIFFSetField(tif, TIFFTAG_WHITELEVEL, 1, &max_white);
TIFFWriteScanline(tif, image[0], 0, 0);
TIFFWriteScanline(tif, image[1], 1, 0);
TIFFWriteScanline(tif, image[2], 2, 0);
TIFFWriteScanline(tif, image[3], 3, 0);
TIFFClose(tif);
return 0;
}
생성하는 TIF 파일에 대한 링크를 제공 할 수 있습니까? –
@mark 예, 확실합니다. [Here] (https://www.dropbox.com/s/b1garp645eoj64q/8bitRaw.dng?dl=0) –
TIF가 아닌 DNG입니다. –