기금넷 공식사이트 - 재경 문답 - 대형 tif 형식 파일 자르기 문제(자바 언어로 구현됨)

대형 tif 형식 파일 자르기 문제(자바 언어로 구현됨)

C++로 구현, 먼저 대화 상자와 버튼 만들기

void CTifSliceDlg::OnButton1()

{

IFH ifh ; // 파일 헤더

WORD ec; // 디렉토리 항목 수

DE *de1, *de2; // 소스 파일과 대상 파일의 디렉토리 항목

DWORD nextIFD; // 다음 IFD 오프셋

DWORD 오프셋, 너비, 높이; // 이미지 데이터 오프셋, 너비, 높이

UpdateData();

긴 m_x1 = m_x - m_size / 2;

긴 m_x2 = m_x m_size / 2 - 1

긴 m_y1 = m_y - m_size / 2; m_y2 = m_y m_size / 2 - 1;

FILE *fp1 = fopen("D:/zxz/imagery.tif", "rb") // 소스 이미지 열기

FILE *fp2 = fopen("D:/zxz/" m_filename ".tif", "wb"); // 대상 이미지 열기

fseek(fp1, 0, SEEK_SET);< /p >

fread(amp; ifh, sizeof(ifh), 1, fp1); // IFH 읽기

if ((ifh.byteOrder == 0x4949) amp; amp; (ifh.version = = 0x2a)) // 바이트 순서 및 버전에 문제가 있는지 확인

{

fseek(fp1, ifh.offsetToIFD, SEEK_SET) // IFD 찾기

p>

fread(amp;ec, 2, 1, fp1); //읽은 디렉토리 항목 수

de1 = new DE[ec];

de2 = new DE[ec];

fread(de1, sizeof(DE), ec, fp1); // 모든 디렉토리 항목 읽기

memcpy(de2, de1, sizeof(DE) * ec); // 대상 이미지의 디렉토리 항목으로 복사

fread(amp; nextIFD, 4, 1, fp1) // 다음 IFD 오프셋 읽기

if ( nextIFD == 0) // 0은 다음 IFD가 없음을 의미합니다.

{

fwrite(amp; ifh, sizeof(ifh), 1, fp2) // IFH 쓰기 대상 Picture

fwrite(amp; ec, 2, 1, fp2); // 대상 그림에 디렉터리 항목 수를 씁니다.

for (int i = 0; i lt; ec; i )

{

스위치 (de2[i].tag)

{

케이스 256: //너비< /p >

de2[i].valueOffset = m_x2 -

m_x1 1; //대상 이미지의 너비 수정

width = de1[i].valueOffset; //소스 이미지의 너비 가져오기

break;

case 257: //높이

de2[i].valueOffset = m_y2 - m_y1 1; // 대상 이미지의 높이 수정

height = de1[i] .valueOffset; // 소스 이미지 높이 가져오기

break;

case 273: //이미지 데이터 오프셋

offset = de2[i].valueOffset; //소스 이미지 데이터 오프셋 가져오기 Shift

break;

case 278: //이미지 데이터 행 수

de2[i].valueOffset = m_y2 - m_y1 1; // 대상 이미지 수정 이미지 데이터 행 수

break;

case 279: //이미지 데이터 바이트 수

de2[ i].valueOffset = (m_x2 - m_x1 1) * (m_y2 - m_y1 1); // 대상 이미지 데이터의 바이트 수를 수정합니다.

break; >

}

fwrite(de2, sizeof(DE), ec, fp2); // 대상 이미지에 디렉터리 항목 쓰기

fwrite(amp; nextIFD, 4 , 1, fp2); // 다음 IFD 오프셋 이동 및 대상 이미지에 쓰기

long curpos = ftell(fp1);

char *buf = new char[offset - curpos];

fread(buf, offset - curpos, 1, fp1); // 소스 이미지의 현재 위치와 이미지 데이터 사이의 모든 바이트를 읽습니다.

fwrite(buf , offset - curpos, 1, fp2); // 대상 Figure 작성

delete[] buf;

buf = new char[m_x2 - m_x1 1];

for (i = m_y1; i lt; = m_y2; i )

{

fseek(fp1, offset (i * width m_x1), SEEK_SET) // 찾기 m_x1에 있는 이미지의 i번째 행

fread(buf, m_x2 - m_x1 1, 1, fp1) // m_x1과 m_x2 사이의 데이터를 읽습니다.

fwrite(buf , m_x2 - m_x1 1, 1, fp2); // 대상 Figure 작성

}

delete[] buf;

}

else

{

MessageBox("파일 형식이 잘못되었습니다! ");

}

삭제[] de1;

삭제[

] de2;

}

else

{

MessageBox("파일 형식이 잘못되었습니다!");

}

fclose(fp1);

fclose(fp2)

MessageBox("슬라이싱 성공!"); > }