bool FPngImageWrapper::LoadPNGHeader() { check(CompressedData.Num()); // Test whether the data this PNGLoader is pointing at is a PNG or not. if (IsPNG()) { // thread safety FScopeLock PNGLock(&GPNGSection); png_structp png_ptr = png_create_read_struct_2( PNG_LIBPNG_VER_STRING, this, FPngImageWrapper::user_error_fn, FPngImageWrapper::user_warning_fn, NULL, FPngImageWrapper::user_malloc, FPngImageWrapper::user_free ); check(png_ptr); png_infop info_ptr = png_create_info_struct( png_ptr ); check(info_ptr); PNGReadGuard PNGGuard(&png_ptr, &info_ptr); { png_set_read_fn(png_ptr, this, FPngImageWrapper::user_read_compressed); png_read_info(png_ptr, info_ptr); Width = info_ptr->width; Height = info_ptr->height; ColorType = info_ptr->color_type; BitDepth = info_ptr->bit_depth; Channels = info_ptr->channels; Format = (ColorType & PNG_COLOR_MASK_COLOR) ? ERGBFormat::RGBA : ERGBFormat::Gray; } return true; } return false; }
IM_TYPE CFormatDetector::ImageFormat(UIC::BaseStreamInput& in) { IM_TYPE fmt; BaseStream::TStatus status; fmt = IT_UNKNOWN; if(IsBMP(in)) fmt = IT_BMP; else if(IsPNG(in)) fmt = IT_PNG; else if(IsJPEG(in)) fmt = IT_JPEG; else if(IsJPEG2000(in)) fmt = IT_JPEG2000; else if(IsDICOM(in)) fmt = IT_DICOM; else if(IsJPEGXR(in)) fmt = IT_JPEGXR; status = in.Seek(0,UIC::BaseStreamInput::Beginning); if(UIC::BaseStreamInput::StatusOk != status) return IT_UNKNOWN; return fmt; } // CFormatDetector::ImageFormat()
BOOL CImage::Load(CString sFileName) { Destroy(); FILE* f = NULL; _TFOPEN_S(f, sFileName.GetBuffer(0), _T("rb")); if(f==NULL) return FALSE; if(IsBitmap(f)) { fclose(f); return LoadBitmapFromBMPFile(sFileName.GetBuffer(0)); } else if(IsPNG(f)) { fclose(f); return LoadBitmapFromPNGFile(sFileName.GetBuffer(0)); } else if(IsJPEG(f)) { fclose(f); return LoadBitmapFromJPEGFile(sFileName.GetBuffer(0)); } fclose(f); return FALSE; }
//エントリーポイント int __stdcall wWinMain(HINSTANCE Instance,HINSTANCE,LPWSTR,int) { MSG Msg; std::vector<wchar_t> Buffer(MAX_PATH,0); DWORD Length; //自身のディレクトリを取得する Length=GetModuleFileName(nullptr,Buffer.data(),MAX_PATH); std::wstring ThisPath(Buffer.data()); ThisPath[ThisPath.find_last_of(L'\\')]=L'\0'; //カレントディレクトリをexeと同じ場所に設定 SetCurrentDirectory(ThisPath.c_str()); //Shiftキーが押されていたらアップロードした画像を開かない ShowBrowser=!(GetKeyState(VK_SHIFT)&0x8000); if(Gdiplus::GdiplusStartup(&Token,&StartupInput,nullptr)!=Gdiplus::Status::Ok) return 1; Brush.reset(CreateSolidBrush(RGB(100,100,100)),[](void* Obj){if(Obj) DeleteObject(Obj);}); std::atexit(ShutdownGdiplus); //引数にファイルが指定されていたら if(__argc==2){ //ファイルをアップロードして終了 if(IsPNG(__wargv[1])){ //PNG はそのままアップロード UploadFile(__wargv[1],ShowBrowser); }else{ //PNG 形式に変換 std::vector<wchar_t> TempDirectory(MAX_PATH,0),TempFile(MAX_PATH,0); GetTempPath(MAX_PATH,TempDirectory.data()); GetTempFileName(TempDirectory.data(),TempPrefix,0,TempFile.data()); if(ConvertPNG(TempFile.data(),__wargv[1])){ //アップロード UploadFile(TempFile.data(),ShowBrowser); }else{ //PNGに変換できなかった... MessageBox(nullptr,L"画像をPNG形式に変換する事が出来ません。",Title,MB_OK|MB_ICONERROR); } DeleteFile(TempFile.data()); } return true; } //ウィンドウクラスを登録 RegisterWindowClass(Instance); //アプリケーションの初期化 if(!InitInstance(Instance)) return 1; //メインメッセージループ while(GetMessage(&Msg,nullptr,0,0)){ TranslateMessage(&Msg); DispatchMessage(&Msg); } return (int)Msg.wParam; }
BOOL CImage::IsImageFile(CString sFileName) { FILE* f = NULL; _TFOPEN_S(f, sFileName.GetBuffer(0), _T("rb")); if(f==NULL) return FALSE; if(IsBitmap(f) || IsPNG(f) || IsJPEG(f)) { fclose(f); return TRUE; } fclose(f); return FALSE; }
static bool IsImage(const char* filename) { return IsJPEG(filename) || IsPNG(filename) || IsPCX(filename) || IsBMP(filename) || IsGIF(filename); }