2016-11-09 2 views
1

LibTiff의 TIFFGetField 함수를 사용하여 문자열 TIFF 필드 (예 : TIFFTAG_MODEL)를 읽으려고했지만 그로부터 얻은 것은 모두 제로화 된 메모리에 대한 포인터입니다. TIFFGetField man page은 그다지 도움이되지 않습니다. 단순히 문자열 필드에 대해 char** 인수가 필요하다고 말하면서 암시 적으로 메모리를 할당하고 해당 문자열을 해당 메모리에 쓰고 포인터를 반환한다고 제안합니다. 그러나 그때 그 기억을 해방하는 것에 대한 책임을 논의하지 않습니다.LIFTIFF의 TIFFGetField를 사용하여 TIFF 문자열 필드를 검색하는 방법은 무엇입니까?

char*을 정의하고이를 NULL로 초기화 한 다음 해당 변수의 주소를 TIFFGetField로 전달하면 NULL이 아닌 주소로 설정되지만 해당 주소가 가리키는 메모리는 모두 0입니다.

관련성이있는 경우 MacOS에서 LibTiff 4.0.2를 사용하고 있습니다.

여기 MCVE가 있으며 지금까지 시도한 내용이 있습니다. (주석 처리 된 코드는 내가 대신 이미 할당 된 버퍼에 전달하는 실험을 한 곳입니다 중 하나가 작동하지 않았다..)

#include "tiffio.h" 
#include <stdio.h> 

const char* img_filename = "temp.tif"; 

void WriteTestTIFF() 
{ 
    TIFF* tiff = TIFFOpen(img_filename, "w"); 

    const size_t width = 2; 
    const size_t height = 2; 
    unsigned char image[width * height] = { 0 }; 

    TIFFSetField(tiff, TIFFTAG_IMAGEWIDTH, width); 
    TIFFSetField(tiff, TIFFTAG_IMAGELENGTH, height); 
    TIFFSetField(tiff, TIFFTAG_ROWSPERSTRIP, height); // Single strip image 
    TIFFSetField(tiff, TIFFTAG_COMPRESSION, COMPRESSION_NONE); 
    TIFFSetField(tiff, TIFFTAG_BITSPERSAMPLE, 8); 
    TIFFSetField(tiff, TIFFTAG_SAMPLESPERPIXEL, 1); 
    TIFFSetField(tiff, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK); 
    TIFFSetField(tiff, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT); 
    TIFFSetField(tiff, TIFFTAG_MINSAMPLEVALUE, 0); 
    TIFFSetField(tiff, TIFFTAG_MAXSAMPLEVALUE, 255); 

    TIFFSetField(tiff, TIFFTAG_SOFTWARE, "TestingTIFFStringFields"); 
    TIFFSetField(tiff, TIFFTAG_MODEL, "FakeCamera"); 

    TIFFWriteEncodedStrip(tiff, 0, image, height * width); 
    TIFFClose(tiff); 
} 

void ReadTestTIFF() 
{ 
    TIFF* tiff = TIFFOpen(img_filename, "r"); 
    //char buffer[256] = ""; 
    char* char_ptr = NULL; 
    uint32 width = 0; 
    uint32 height = 0; 
    printf("(void*)char_ptr=0x%016lX\n", (unsigned long)char_ptr); 
    //printf("buffer='%s'\n", buffer); 
    if (/*TIFFGetField(tiff, TIFFTAG_MODEL, buffer) != 1 
     ||*/ TIFFGetField(tiff, TIFFTAG_MODEL, &char_ptr) != 1 
     || TIFFGetField(tiff, TIFFTAG_IMAGEWIDTH, &width) != 1 
     || TIFFGetField(tiff, TIFFTAG_IMAGELENGTH, &height) != 1) 
    { 
     puts("One or more TIFFGetField calls failed."); 
    } 
    printf("width=%u\n", width); 
    printf("height=%u\n", height); 
    TIFFClose(tiff); 
    printf("(void*)char_ptr=0x%016lX\n", (unsigned long)char_ptr); 
    for (int n=0; n<5; n++) 
    { 
     printf("char_ptr[%d]=0x%02X\n", n, (unsigned int)(char_ptr[n])); 
    } 
    //printf("buffer='%s'\n", buffer); 
    printf("char_ptr='%s'\n", char_ptr); 
} 

int main() 
{ 
    WriteTestTIFF(); 
    ReadTestTIFF(); 
    return 0; 
} 

출력 :

(void*)char_ptr=0x0000000000000000 
width=2 
height=2 
(void*)char_ptr=0x00007FA5B3400310 
char_ptr[0]=0x00 
char_ptr[1]=0x00 
char_ptr[2]=0x00 
char_ptr[3]=0x00 
char_ptr[4]=0x00 
char_ptr='' 

그리고 바로 이러한 필드에 이상이 없음을 입증 char_ptr에 액세스하기 전에 아마도 TIFFClose()하지

0000000: 4949 2a00 0c00 0000 0000 0000 0e00 0001 II*............. 
0000010: 0300 0100 0000 0200 0000 0101 0300 0100 ................ 
0000020: 0000 0200 0000 0201 0300 0100 0000 0800 ................ 
0000030: 0000 0301 0300 0100 0000 0100 0000 0601 ................ 
0000040: 0300 0100 0000 0100 0000 1001 0200 0b00 ................ 
0000050: 0000 d200 0000 1101 0400 0100 0000 0800 ................ 
0000060: 0000 1501 0300 0100 0000 0100 0000 1601 ................ 
0000070: 0300 0100 0000 0200 0000 1701 0400 0100 ................ 
0000080: 0000 0400 0000 1801 0300 0100 0000 0000 ................ 
0000090: 0000 1901 0300 0100 0000 ff00 0000 3101 ..............1. 
00000a0: 0200 1800 0000 ba00 0000 5301 0300 0100 ..........S..... 
00000b0: 0000 0100 0000 0000 0000 5465 7374 696e ..........Testin 
00000c0: 6754 4946 4653 7472 696e 6746 6965 6c64 gTIFFStringField 
00000d0: 7300 4661 6b65 4361 6d65 7261 000a  s.FakeCamera.. 

답변

2

: 제대로 작성되고, 여기에 결과 TIFF 파일입니다. 그것은 아마도 TIFFOpen()에 의해 생성되거나 채워지는 어떤 데이터 구조에 주소를 되돌려주고, TIFFClose()에 의해 파기됩니다.

+0

정말 문제였습니다. 감사합니다. 또한 문자열이 해제되는 방법에 대한 질문에 대답합니다. –