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..
정말 문제였습니다. 감사합니다. 또한 문자열이 해제되는 방법에 대한 질문에 대답합니다. –