기금넷 공식사이트 - 재경 문답 - 대형 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("슬라이싱 성공!"); > }
- 관련 기사