#pragma once //ビットマップバイト幅の算出マクロ #ifndef WIDTHBYTES #define WIDTHBYTES(bits) (((bits)+31)/32*4) #endif//WIDTHBYTES //BI_BITFIELDSマスクタイプ #define RGB555 0x007C3E1F #define RGB565 0x00F87E1F #define RGB888 0x00FFFFFF #define RGBA8888 0xFFFFFFFF //ビットマップの指定位置のピクセル色を取り出す COLORREF __stdcall _GetPixel(HBITMAP hBitmap,int X,int Y); //DIBの指定位置のピクセル色を指定色に設定する BOOL __stdcall _SetPixel(HBITMAP hBitmap,int X,int Y,COLORREF color); //カラーテーブルのソート UINT __stdcall _SortColorTable(UINT cEntries,RGBQUAD *prgbq,BOOL bDarkToBlight=TRUE); //DIBのカラーテーブルからRGB(赤、緑、青)カラーの値を取得 UINT __stdcall _GetDIBColorTable(HBITMAP hBitmap,UINT iStart,UINT cEntries,RGBQUAD *prgbq); //DIBのカラーテーブルにRGB(赤、緑、青)カラーの値を設定 UINT __stdcall _SetDIBColorTable(HBITMAP hBitmap,UINT iStart,UINT cEntries,const RGBQUAD *prgbq); //カラーマスク値のカラーマスクタイプを取得します。 // 戻り値:RGB555/RGB565/RGB888/RGBA8888、エラー値:FALSE int __stdcall _GetColorMaskType(DWORD* lpBitfields); //32ビットDIBの色数を求める UINT __stdcall _CountDIB32ColorTable(UINT cEntries,RGBQUAD* pRgbq,HBITMAP hbmDIB32); //DDB->DIB変換 HBITMAP __stdcall _DDBToDIB(HBITMAP hBitmap,UINT bitCount,int nMaskBits); //DIBセクションのコピー(忠実コピー) HBITMAP __stdcall _CopyDIB(HBITMAP hBitmap); //ビット深度の違うDIBを複製する HBITMAP __stdcall _CopyDIB(HBITMAP hBitmap,UINT nBitsPerPixel,UINT nMaskType); //DIBの作成 HBITMAP __stdcall _CreateDIB(int nWidth,int nHeight,UINT nBitCount,UINT nMaskType=0, UINT cEntries=0,RGBQUAD *prgbq=0,const void *lpBits=0); //パックされたDIBからDIBセクションを作成します。 HBITMAP __stdcall _CreateDIBIndirect(BITMAPINFO* pPackedDIB); //パックされたDIB(ランレングス圧縮を含む)からDIBセクションを作成します。 HBITMAP __stdcall _CreateDIBIndirect(BITMAPINFO* pPackedDIB,DWORD dwDIBSize); //BITMAPINFO構造体とピクセルビットからDIBの作成 HBITMAP __stdcall _CreateDIBIndirect(BITMAPINFO* pBmi,CONST VOID *lpvBits); //DIBハンドルからBITMAPINFO構造体を取得します。 DWORD __stdcall _FillBitmapInfo(HBITMAP hbmDIB,BITMAPINFO* pBmi,DWORD dwMemSize,VOID** ppvBits); //DIBファイルストリームの読み込み HBITMAP __stdcall _DIBStreamIn(CFile* infile,LPDWORD lpdwCompression=NULL); //DIBファイルの読み込み HBITMAP __stdcall _LoadDIB(LPCTSTR lpszFileName,LPDWORD lpdwCompression=NULL); //ピットマップリソースの読み込み HBITMAP __stdcall _LoadDIBFromResource(HMODULE hModule,LPCTSTR lpName,LPDWORD lpdwCompression); HBITMAP __stdcall _LoadDIBFromResource(LPCTSTR lpszExeName,LPCTSTR lpName,LPDWORD lpdwCompression=0); //DIBファイルストリームの書き込み BOOL __stdcall _DIBStreamOut(CFile* outfile,HBITMAP hbmDIB,DWORD dwCompression=BI_RGB); //DIBをファイルに書き出す BOOL __stdcall _SaveDIB(LPCTSTR lpszFileName,HBITMAP hbmDIB,DWORD dwCompression=BI_RGB); //指定した透過色からマスクビットマップを作成 HBITMAP __stdcall _CreateMaskBitmap(HBITMAP hbmDIB,COLORREF colorMask); //カラービットマップとマスクビットマップからアルファブレンドDIBを作成する HBITMAP __stdcall _CreateAlphaBlendDIB(HBITMAP hbmColor,HBITMAP hbmMask); //パレットDIBのマスク部分を指定色で満たしたDIBを作成する //colorFill=-1の時は、DIBの色と重ならない色を探してカラーパレットに新たに挿入する HBITMAP __stdcall _CreateMaskFilledDIB(HBITMAP hbmColor,HBITMAP hbmMask,COLORREF colorFill=-1); //BITMAPの四隅の色から透過色を取得する COLORREF __stdcall _GetMaskColorByEdgeColor(HBITMAP hBitmap,COLORREF* pColorMaskTable=0,int nColors=0); //カラー/マスクDIBから透過色を求める COLORREF __stdcall _GetMaskColorByMaskBitmap(HBITMAP hbmColor,HBITMAP hbmMask); //DIBセクションの描画 BOOL __stdcall _DrawBitmap(HDC hDC,int xDst,int yDst,int cxDst,int cyDst,HBITMAP hbmColor, HBITMAP hbmMask,int xSrc,int ySrc,int cxSrc,int cySrc); // CDIBFile command target class CDIBFile : public CObject { public: // Constructors CDIBFile(); //DIBの作成 BOOL CreateDIB(HDC hDC,int nWidth,int nHeight,UINT nBitcount,UINT nMaskType, UINT cEntries=0,RGBQUAD *prgbq=0,const void* lpBits=0); BOOL CreateDIBIndirect(HDC hDC,BITMAPINFO* pBmi); //ファイルの読み込み virtual BOOL LoadFile(LPCTSTR lpszFileName); //リソースの読み込み virtual BOOL LoadResource(HMODULE hModule,LPCTSTR lpName); virtual BOOL LoadResource(LPCTSTR lpszExeName,LPCTSTR lpName); //ファイルの書き込み virtual BOOL SaveFile(LPCTSTR lpszFileName); // Attributes virtual ~CDIBFile(); //オーバーライド virtual BOOL Attach(HBITMAP hbmColor,HBITMAP hbmMask=0); virtual HBITMAP Detach(HBITMAP* lphbmMask=0); virtual void Delete(); virtual void Undo(); virtual BOOL IsUndoEnable(){return (m_hbmColorPrev!=0);}; // Operations //画像幅の取得 virtual UINT Width(){return m_width;}; //画像高さの取得 virtual UINT Height(){return m_height;}; //画像の圧縮形式の取得 virtual DWORD Compression(){return m_dwCompression;}; //画像の圧縮形式の設定 virtual void SetCompression(DWORD dwCompression){m_dwCompression=dwCompression;}; //画像のビット深度の取得 virtual int BitCount(){return m_bitCount;}; //画像のビット深度の設定 virtual BOOL SetBitCount(UINT nBitsPerPixel,UINT nMaskType=0, BOOL bMedianCut=TRUE,BOOL bDither=TRUE); //DIBハンドルの取得 virtual HANDLE GetSafeHandle(){return (HANDLE)m_hbmColor;}; //DIBハンドルの取得 virtual HBITMAP GetDIB(HBITMAP* lphbmMask); //ビットフィールドマスクタイプの取得 virtual UINT MaskType(){return m_nMaskType;}; //ファイル名の取得 virtual LPCTSTR GetFileName(){return m_strFileName.GetBuffer();}; //ファイル名の設定 virtual void SetFileName(LPCTSTR lpszFileName){m_strFileName.SetString(lpszFileName);}; //リソース名の取得 virtual LPCTSTR GetResName(){return m_lpResName;}; //リソース名の設定 virtual void SetResName(LPCTSTR lpName); //リソースタイプの取得 virtual LPCTSTR GetResType(){return m_lpResType;}; //リソースタイプの設定 virtual void SetResType(LPCTSTR lpType); //色数の取得 virtual UINT ColorUsed(){return m_nColorUsed;}; //マスクカラーの取得(エラー時戻り値:-1) virtual COLORREF GetMaskColor(){return m_colorMask;}; //マスクカラーの設定 virtual void SetMaskColor(COLORREF colorMask){m_colorMask=colorMask;}; //マスクDIBの作成 virtual BOOL CreateMask(); //マスクDIBの削除 virtual BOOL DeleteMask(); //マスクDIBの有無 virtual BOOL IsMaskExist(){return (m_hbmMask!=0);}; //画像の描画 virtual void OnDraw(CDC* pDC); private: UINT m_bitCount; UINT m_nColorUsed; DWORD m_dwCompression; UINT m_nMaskType; UINT m_width; UINT m_height; HBITMAP m_hbmColorPrev; HBITMAP m_hbmMaskPrev; CString m_strFileName; LPCTSTR m_lpResName; LPCTSTR m_lpResType; COLORREF m_colorMask; public: HBITMAP m_hbmColor; HBITMAP m_hbmMask; CRect m_rect; //画像の表示位置/サイズ }; //DIBハンドルの取得 inline HBITMAP CDIBFile::GetDIB(HBITMAP* lphbmMask) { if (AfxIsValidAddress(lphbmMask,sizeof(HBITMAP))) *lphbmMask=m_hbmMask; return m_hbmColor; } //マスクDIBの作成 inline BOOL CDIBFile::CreateMask() { HBITMAP hbmMask=_CreateMaskBitmap(m_hbmColor,m_colorMask); if (!hbmMask) return FALSE; HBITMAP hbmColor=_CopyDIB(m_hbmColor); return Attach(hbmColor,hbmMask); } //マスクDIBの削除 inline BOOL CDIBFile::DeleteMask() { HBITMAP hbmColor=_CopyDIB(m_hbmColor); return Attach(hbmColor,0); } //リソース名の設定 inline void CDIBFile::SetResName(LPCTSTR lpName) { if (HIWORD(m_lpResName)) delete[]m_lpResName; if (HIWORD(lpName)){ m_lpResName=new TCHAR[::lstrlen(lpName)+1]; ::lstrcpy((LPTSTR)m_lpResName,lpName); } else m_lpResName=lpName; } //リソースタイプの設定 inline void CDIBFile::SetResType(LPCTSTR lpType) { if (HIWORD(m_lpResType)) delete[]m_lpResType; if (HIWORD(lpType)){ m_lpResType=new TCHAR[::lstrlen(lpType)+1]; ::lstrcpy((LPTSTR)m_lpResType,lpType); } else m_lpResType=lpType; }