"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
👨💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.
MFC 에서 이미지 파일이 깨졌는지 확인하려면 어떻게 해야 하는지 간략히 알아보았습니다.
질문 >
MFC 에서 이미지 파일이 깨졌는지 확인하려면 어떻게 해야 하나요?
답변 >
MFC에서 이미지 파일이 깨졌는지 확인하는 방법은 여러 가지가 있습니다. 일반적으로 다음과 같은 방법을 사용할 수 있습니다.
1. 이미지 파일을 직접 로드해보기 (GDI+)
이미지가 정상적인지 확인하려면 GDI+를 사용하여 직접 로드해볼 수 있습니다.
#include <gdiplus.h>
#pragma comment(lib, "gdiplus.lib")
bool IsImageValid(const CString& filePath) {
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, nullptr);
Gdiplus::Bitmap* bitmap = Gdiplus::Bitmap::FromFile(filePath);
bool isValid = (bitmap && bitmap->GetLastStatus() == Gdiplus::Ok);
delete bitmap;
Gdiplus::GdiplusShutdown(gdiplusToken);
return isValid;
}
✅ 정상적인 이미지라면 true, 깨진 이미지라면 false를 반환합니다.
2. 파일 포맷 검증 (파일 헤더 확인)
이미지 파일은 특정한 파일 헤더(Signature)를 가지므로, 파일을 직접 열어 첫 몇 바이트를 확인하는 것도 좋은 방법입니다.
예를 들어, JPEG, PNG 등의 대표적인 이미지 포맷의 헤더를 체크할 수 있습니다.
헤더 검증 코드 (JPEG & PNG 예제)
#include <fstream>
bool CheckImageHeader(const CString& filePath) {
std::ifstream file(filePath, std::ios::binary);
if (!file.is_open()) return false;
unsigned char header[8] = {0};
file.read(reinterpret_cast<char*>(header), sizeof(header));
// JPEG 헤더 검증 (0xFF 0xD8 0xFF 로 시작)
if (header[0] == 0xFF && header[1] == 0xD8 && header[2] == 0xFF) {
return true;
}
// PNG 헤더 검증 (89 50 4E 47 0D 0A 1A 0A)
if (header[0] == 0x89 && header[1] == 0x50 && header[2] == 0x4E && header[3] == 0x47 &&
header[4] == 0x0D && header[5] == 0x0A && header[6] == 0x1A && header[7] == 0x0A) {
return true;
}
return false;
}
✅ 정상적인 이미지 파일이면 true, 손상된 파일이거나 이미지가 아니면 false를 반환합니다.
3. 파일 크기 검증 (너무 작은 파일 감지)
손상된 이미지 파일은 일반적으로 크기가 0바이트이거나, 비정상적으로 작을 가능성이 높습니다.
따라서 파일 크기를 확인하여 기준보다 작은 경우 깨진 이미지로 간주할 수 있습니다.
#include <sys/stat.h>
bool IsFileTooSmall(const CString& filePath, size_t minSize = 100) { // 최소 100바이트 이상
struct _stat fileStat;
if (_tstat(filePath, &fileStat) != 0) {
return true; // 파일이 존재하지 않음
}
return (fileStat.st_size < minSize);
}
✅ 파일 크기가 너무 작으면 깨진 파일로 간주할 수 있습니다.
4. 썸네일 생성 시도 (깨진 이미지 감지)
GDI+를 사용하여 이미지를 불러온 후 썸네일을 생성해보는 방법도 있습니다.
썸네일이 생성되지 않으면, 이미지가 깨졌을 가능성이 높습니다.
#include <gdiplus.h>
#pragma comment(lib, "gdiplus.lib")
bool IsThumbnailValid(const CString& filePath) {
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, nullptr);
Gdiplus::Bitmap* bitmap = Gdiplus::Bitmap::FromFile(filePath);
if (!bitmap || bitmap->GetLastStatus() != Gdiplus::Ok) {
delete bitmap;
Gdiplus::GdiplusShutdown(gdiplusToken);
return false;
}
Gdiplus::Bitmap* thumbnail = bitmap->GetThumbnailImage(100, 100, nullptr, nullptr);
bool isValid = (thumbnail != nullptr);
delete thumbnail;
delete bitmap;
Gdiplus::GdiplusShutdown(gdiplusToken);
return isValid;
}
✅ 썸네일이 생성되지 않으면 깨진 이미지로 판단할 수 있습니다.
5. 이미지 라이브러리 활용 (FreeImage, OpenCV 등)
더 강력한 이미지 검증이 필요하면 FreeImage나 OpenCV 같은 라이브러리를 사용할 수도 있습니다.
OpenCV 예제 (이미지 로드 확인)
#include <opencv2/opencv.hpp>
bool IsImageValidOpenCV(const CString& filePath) {
cv::Mat image = cv::imread(CT2A(filePath), cv::IMREAD_UNCHANGED);
return !image.empty();
}
✅ OpenCV의 cv::imread 함수로 이미지가 정상적으로 열리는지 확인할 수 있습니다.
결론
✅ 빠르게 확인하려면?
👉 파일 헤더 검사 (CheckImageHeader) + 파일 크기 검사 (IsFileTooSmall)
✅ 정밀 검사를 원한다면?
👉 GDI+를 활용한 로딩 테스트 (IsImageValid) + 썸네일 생성 (IsThumbnailValid)
✅ 더 강력한 검증이 필요하다면?
👉 OpenCV, FreeImage 등의 라이브러리를 활용
어떤 방법이든 MFC에서 이미지 파일의 무결성을 빠르게 확인하는 데 도움이 될 것입니다. 🚀
🎬 유튜브 채널 🎬
위로그@WiLog
📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리(Willee) 입니다. 📢 위로그@WiLog 는 자기계발을 목적으로 하는 채널 입니다. 📢 오늘도 즐겁게~ 자신을 위한 계발을 함께 해보아요~ d^_^b 📌
www.youtube.com
🎬 치지직 채널 🎬
위로그 채널 - CHZZK
지금, 스트리밍이 시작됩니다. 치지직-
chzzk.naver.com