掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
保存について (ID:54039)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
int ret; CString ext_filter = "BMP|*.bmp|"; CFileDialog savefile(FALSE,"BMP", NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT , ext_filter); ret = savefile.DoModal(); if(ret == IDOK){ char filename[128]; sprintf(filename,"%s",savefile.GetPathName()); CWnd *wnd = GetDlgItem(IDC_PICT1); CRect rt; wnd -> GetClientRect(&rt); CDC * pDC = wnd->GetDC( ); CFile file; CFileException fx; if( !file.Open(filename, CFile::modeCreate|CFile::modeReadWrite, &fx) ) { } else{ char *wkmem = new char[3072 * 2048 * 2]; CDC dcMm ; BITMAPINFO* pbminfo ; HBITMAP hBITMAP ; HGLOBAL hMem = GlobalAlloc( GMEM_MOVEABLE | GMEM_ZEROINIT,sizeof( BITMAPINFO ) ) ; pbminfo = (BITMAPINFO*) GlobalLock( hMem ) ; pbminfo->bmiHeader.biSize = sizeof( BITMAPINFOHEADER ) ; pbminfo->bmiHeader.biWidth = 3072 ; pbminfo->bmiHeader.biHeight = 2048 ; pbminfo->bmiHeader.biPlanes = 1 ; pbminfo->bmiHeader.biBitCount = 16 ; //bit color pbminfo->bmiHeader.biCompression = BI_RGB; pbminfo->bmiHeader.biSizeImage = 0 ; pbminfo->bmiHeader.biXPelsPerMeter = 0 ; pbminfo->bmiHeader.biYPelsPerMeter = 0 ; pbminfo->bmiHeader.biClrUsed = 0 ; pbminfo->bmiHeader.biClrImportant = 0 ; pbminfo->bmiColors[0].rgbRed = NULL; pbminfo->bmiColors[0].rgbGreen = NULL; pbminfo->bmiColors[0].rgbBlue = NULL; pbminfo->bmiColors[0].rgbReserved = 0 ; hBITMAP = CreateDIBitmap( pDC->m_hDC,&(pbminfo- >bmiHeader),CBM_INIT,wkmem,pbminfo,DIB_RGB_COLORS ) ; dcMm.CreateCompatibleDC( pDC ) ; HBITMAP *oldbitmap = (HBITMAP *)dcMm.SelectObject( hBITMAP ) ; dcMm.SetStretchBltMode( STRETCH_DELETESCANS ) ; dcMm.StretchBlt( 0,0, 3072, 2048, pDC, 0,0, 3072, 2048 ,SRCCOPY ); GetDIBits(dcMm.m_hDC, hBITMAP, 0, 2048, wkmem, pbminfo, DIB_RGB_COLORS ) ; BITMAPFILEHEADER bfh; bfh.bfType = WORD(0x4d42); //BM bfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof (BITMAPINFOHEADER) + 3078 * 2048; bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof (BITMAPINFOHEADER) ; bfh.bfReserved1 = bfh.bfReserved2 = 0; file.Write( &bfh, sizeof(BITMAPFILEHEADER) ); file.Write( pbminfo, sizeof(BITMAPINFOHEADER)); file.Write( wkmem, 3078 * 2048*2); file.Close(); dcMm.SelectObject( oldbitmap ) ; DeleteObject( hBITMAP ) ; DeleteDC( dcMm ) ; GlobalUnlock( hMem ); GlobalFree( hMem ) ; delete [] wkmem; このような感じで保存するソースは作っています。 //ファイルダイアログを表示してファイル指定する CFileDialog myDLG (TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, "ビットマップ(*.BMP)|*.BMP||"); if(myDLG.DoModal()!=IDOK) return; //取得したファイルをオープンする filename = myDLG.GetPathName(); if(!file.Open(filename,CFile::modeRead|CFile::typeBinary)){ return; } //ファイルヘッダ部とインフォヘッダ部を読み込む file.Read(&m_BmpFileHdr,sizeof(BITMAPFILEHEADER)); file.Read(&myBmpInfoHdr,sizeof(BITMAPINFOHEADER)); //前回使用していれば、一旦メモリ解放する if(m_BmpInfo) delete[] m_BmpInfo; //色情報を取得する。biBitCountは1ピクセルあたりのカラー表現 //ビット数1,4,8,16,24,32がある、数字が大きいほ ど精細表現が可能 //16ビット以上と未満でカラーデータ格納が異なる if(myBmpInfoHdr.biBitCount >= 16){ m_BmpInfo = (LPBITMAPINFO)new char[sizeof (BITMAPINFOHEADER)]; } else{ m_BmpInfo = (LPBITMAPINFO)new char[sizeof (BITMAPINFOHEADER)+ (1<<myBmpInfoHdr.biBitCount)*sizeof (RGBQUAD)]; file.Read(m_BmpInfo->bmiColors, (1<<myBmpInfoHdr.biBitCount)*sizeof(RGBQUAD)); } //m_BmpInfo(LPBITMAPINFO型)のmyBmpInfoHdrメンバに設定 m_BmpInfo->bmiHeader = myBmpInfoHdr; //ファイル内のビットマップ実データ位置に合わせる file.Seek(m_BmpFileHdr.bfOffBits,CFile::begin); //前回の画像イメージを一旦解放 if(m_BmpImage) delete[] m_BmpImage; //実画像データ分のバイト数を確保 //bfsizeビットマップファイル全サイズ //bfOffBits先頭にあるヘッダ情報サイズ m_BmpImage = new char[m_BmpFileHdr.bfSize - m_BmpFileHdr.bfOffBits]; //ビットマップ実データを読み込み格納 file.Read(m_BmpImage,m_BmpFileHdr.bfSize - m_BmpFileHdr.bfOffBits); file.Close(); 読み込むソースはこのような感じです。 よろしくお願いします☆
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.