전통문화대전망 - 전통 공예 - 대형 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;

long 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) ;

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

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

{

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

fread(&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(&nextIFD, 4, 1, fp1) //다음 IFD 오프셋 읽기

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

{

fwrite(&ifh, sizeof(ifh), 1, fp2) // IFH가 대상 이미지를 씁니다.

fwrite(&ec, 2, 1, fp2); // 대상 이미지에 디렉터리 항목 수를 씁니다.

for (int i = 0; i < ec; i++)

{

스위치 (de2[i].tag)

{

케이스 256: //너비

de2[i ].valueOffset = m_x2 - m_x1 + 1; // 대상 이미지의 너비 수정

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

휴식;

> case 257: //높이

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

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

break;

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

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

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 (&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) ; // 대상 그래프 작성

delete[] buf;

buf = new char[m_x2 - m_x1 + 1];

for (i = m_y1 ; i <= m_y2; i++)

{

fseek(fp1, 오프셋 + (i * 너비 + m_x1), SEEK_SET); // 이미지의 i번째 행 m_x1을

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

fwrite(buf, m_x2 - m_x1 + 1, 1, fp2); // 대상 그래프 작성

}

delete[] buf;

}

else

{

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

}

삭제[] de1;

삭제[] de2;

}

else

{

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

}

fclose(fp1);

}

p >

fclose(fp2);

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

}