전통문화대전망 - 전통 공예 - 대형 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]; p>
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("슬라이싱 성공!");
}