123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417 |
- #pragma once
- #include "stdafx.h"
- #include "BSEImgFileMgr.h"
- namespace OTSMODEL {
- // CMsrParamFileMrg
- //IMPLEMENT_SERIAL(CBSEImgFileMgr, CObject, 1)
- // constructor
- CBSEImgFileMgr::CBSEImgFileMgr()
- {
- // initialization
-
- //Init();
- }
- // destructor
- CBSEImgFileMgr::~CBSEImgFileMgr()
- {
- // cleanup
- //Cleanup();
- }
- // CMsrParamFileMrg member functions
- // public
- // serialization
- //void CBSEImgFileMgr::Serialize(CArchive& ar)
- //{
- // // store?
- // if (ar.IsStoring())
- // {
- // // store
- // ar << BSE_IMG_FILE_MARK;
- // ar << BSE_IMG_FILE_VERSION;
- // }
- // else
- // {
- // // load
- // int nMark;
- // ar >> nMark;
- // if (nMark != BSE_IMG_FILE_MARK)
- // {
- // // invalid stage file
- // LogErrorTrace(__FILE__, __LINE__, _T("Serialize: invalid BSE image file."));
- // return;
- // }
- // CString strFileVersion;
- // ar >> strFileVersion;
- // }
- // // member objects serialization
- // m_poBSE->Serialize(ar);
- // // base object serialization
- // CObject::Serialize(ar);
- //}
- // Load/Save
- //BOOL CBSEImgFileMgr::Load(CString a_strPathName /*= _T("")*/, BOOL a_bClear /*= TRUE*/)
- //{
- // AFX_MANAGE_STATE(AfxGetStaticModuleState());
- // // clear all data if necessary
- // if (a_bClear)
- // {
- // Init();
- // }
- // // check file pathname
- // a_strPathName.Trim();
- // if (a_strPathName.IsEmpty())
- // {
- // // file open dialog
- // CFileDialog dlg(TRUE, BSE_IMG_FILE_EXT, NULL, OFN_FILEMUSTEXIST, BSE_IMG_FILE_FILTER);
- // if (dlg.DoModal() != IDOK)
- // {
- // return FALSE;
- // }
- // // get file pathname
- // a_strPathName = dlg.GetPathName();
- // }
- // // open the particle analysis standard file
- // CFile hFile;
- // CFileException ex;
- // if (!hFile.Open(a_strPathName, CFile::modeRead, &ex))
- // {
- // // failed to open the file
- // TCHAR szCause[255];
- // ex.GetErrorMessage(szCause, 255);
- // LogErrorTrace(__FILE__, __LINE__, _T("Load: can't open file %s. error: %s"), a_strPathName, szCause);
- // return FALSE;
- // }
- // // create a loading archive
- // CArchive ar(&hFile, CArchive::load);
- // // file serialization (load)
- // Serialize(ar);
- // // close the file
- // ar.Close();
- // // file pathname
- // m_strPathName = a_strPathName;
- // // ok, return TRUE
- // return TRUE;
- //}
- //BOOL CBSEImgFileMgr::Save(CString a_strPathName /*= _T("")*/)
- //{
- // AFX_MANAGE_STATE(AfxGetStaticModuleState());
- //
- // // check file pathname
- // a_strPathName.Trim();
- // if (a_strPathName.IsEmpty())
- // {
- // // file save as dialog
- // CFileDialog dlg(FALSE, BSE_IMG_FILE_EXT, NULL, OFN_OVERWRITEPROMPT, BSE_IMG_FILE_FILTER);
- // if (dlg.DoModal() != IDOK)
- // {
- // return FALSE;
- // }
- // // get file pathname
- // a_strPathName = dlg.GetPathName();
- // }
- // // create the file
- // CFile hFile;
- // CFileException ex;
- // if (!hFile.Open(a_strPathName, CFile::modeCreate | CFile::modeWrite, &ex))
- // {
- // // failed to open file
- // TCHAR szCause[255];
- // ex.GetErrorMessage(szCause, 255);
- // LogErrorTrace(__FILE__, __LINE__, _T("Save: failed to create file. %s. error: %s"), a_strPathName, szCause);
- // return FALSE;
- // }
- // // create a store archive
- // CArchive ar(&hFile, CArchive::store);
- // // file serialization (store)
- // Serialize(ar);
- // // close the file
- // //hFile.Close();
- // // file pathname
- // m_strPathName = a_strPathName;
- // // ok, return TRUE
- // return TRUE;
- //}
- BOOL CBSEImgFileMgr::LoadFromBitmap(CString a_strPathName /*= _T("")*/, BOOL a_bClear/* = TRUE*/)
- {
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
- // prepare file
- CFile file;
- CFileException fe;
- if (a_bClear)
- {
- //Init();
- }
- // check file pathname
- a_strPathName.Trim();
- if (a_strPathName.IsEmpty())
- {
- // file save as dialog
- CFileDialog dlg(TRUE, BMP_IMG_FILE_EXT, NULL, OFN_FILEMUSTEXIST, BMP_IMG_FILE_FILTER);
- if (dlg.DoModal() != IDOK)
- {
- return FALSE;
- }
- // get file pathname
- m_strPathName = dlg.GetPathName();
- }
- else
- {
- m_strPathName = a_strPathName;
- }
- BYTE* pPixel;
- BYTE* pBmInfo;
- BITMAPFILEHEADER* pBmfh;
- pBmfh = new BITMAPFILEHEADER;
-
- if (!file.Open(m_strPathName, CFile::modeRead, &fe))
- {
- LogInfoTrace(__FILE__, __LINE__, _T("CBSEImgFileMgr::LoadFromBitmap: failed to open image file %s."), a_strPathName);
- return FALSE;
- }
- // read file header
- file.Read(pBmfh, sizeof(BITMAPFILEHEADER));
- pBmInfo = new BYTE[pBmfh->bfOffBits - 14];
- file.Read(pBmInfo, pBmfh->bfOffBits - 14);
- BITMAPINFOHEADER bmih;
- memcpy(&bmih, pBmInfo, sizeof(BITMAPINFOHEADER));
- long width = bmih.biWidth;//获取宽度
- int bitCount = bmih.biBitCount;//获取位数
- long height = bmih.biHeight;//获取高度
- long LineBytes = (width*bitCount + 31) / 32 * 4;//计算每行像素所占的字节数
- pPixel = new BYTE[height*LineBytes];
- file.Read(pPixel, height*LineBytes);
- file.Close();
- CRect imageRect(0, 0, width, height);
- m_poBSE = CBSEImgPtr(new CBSEImg(imageRect));
- //m_poBSE->SetImageRect(imageRect);
- m_poBSE->InitImageData(width,height);
- BYTE* pImageData = m_poBSE->GetImageDataPointer();
- long nActImageSize = width * height;
- for (int i = 0; i < height; i++)
- {
- memcpy(pImageData + i*width, pPixel+(height-1-i)*width, width);
- }
-
- delete[]pPixel;
- delete[]pBmInfo;
- delete pBmfh;
- return TRUE;
- }
- BOOL CBSEImgFileMgr::SaveIntoBitmap(CString a_strPathName)
- {
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
- // prepare file
- CFile file;
- CFileException fe;
- // check file pathname
- a_strPathName.Trim();
- if (a_strPathName.IsEmpty())
- {
- // file save as dialog
- CFileDialog dlg(FALSE, BMP_IMG_FILE_EXT, NULL, OFN_OVERWRITEPROMPT, BMP_IMG_FILE_FILTER);
- if (dlg.DoModal() != IDOK)
- {
- return FALSE;
- }
- // get file pathname
- a_strPathName = dlg.GetPathName();
- }
-
- // create the file
- if (!file.Open(a_strPathName, CFile::modeCreate | CFile::modeWrite, &fe))
- {
- // failed to open file
- TCHAR szCause[255];
- fe.GetErrorMessage(szCause, 255);
- LogErrorTrace(__FILE__, __LINE__, _T("SaveIntoBitmap: failed to create file. %s. error: %s"), a_strPathName, szCause);
- return FALSE;
- }
- LONG nHeight = 0;
- LONG nWidth = 0;
- DWORD bfSize = 0;
-
- nHeight = m_poBSE->GetHeight();
- nWidth = m_poBSE->GetWidth();
-
- BITMAPFILEHEADER* pBmfh;
- BITMAPINFOHEADER* pBmInfo;
- RGBQUAD* pColorTable;
- BYTE* pPixel;
- bfSize = nHeight + nWidth + 1078;
- pBmfh = new BITMAPFILEHEADER;
- pBmfh->bfType = 0x4d42; // BM
- pBmfh->bfSize = bfSize;
- pBmfh->bfReserved1 = 0;
- pBmfh->bfReserved2 = 0;
- pBmfh->bfOffBits = 1078; // 40 + 14 +1024
- pBmInfo = new BITMAPINFOHEADER;
- pBmInfo->biSize = 40;
- pBmInfo->biWidth = nWidth;
- pBmInfo->biHeight = nHeight;
- pBmInfo->biPlanes = 0;
- pBmInfo->biBitCount = 8;
- pBmInfo->biCompression = 0;
- pBmInfo->biSizeImage = nWidth * nHeight;
- pBmInfo->biXPelsPerMeter = 0;
- pBmInfo->biYPelsPerMeter = 0;
- pBmInfo->biClrUsed = 256;
- pBmInfo->biClrImportant = 0;
-
- pColorTable = new RGBQUAD[256];
- for (int i = 0; i<256; i++)
- {
- pColorTable[i].rgbBlue = i;
- pColorTable[i].rgbGreen = i;
- pColorTable[i].rgbRed = i;
- pColorTable[i].rgbReserved = 0;
- }
- try
- {
- file.Write(pBmfh, sizeof(BITMAPFILEHEADER));
- file.Write(pBmInfo, sizeof(BITMAPINFOHEADER));
- file.Write(pColorTable, sizeof(RGBQUAD) * 256);
- long LineBytes = (nWidth*pBmInfo->biBitCount + 31) / 32 * 4;//计算每行像素所占的字节数
- pPixel = new BYTE[nHeight*LineBytes];
-
- BYTE* pImageData = m_poBSE->GetImageDataPointer();
- for (int i = 0; i < nHeight; i++)
- {
- memcpy(pPixel + (nHeight - 1 - i)*nWidth, pImageData + i*nWidth, nWidth);
- }
- file.Write(pPixel, nHeight*LineBytes);
- delete[]pPixel;
- }
- catch (CException *pe)
- {
- pe->Delete();
- LogErrorTrace(__FILE__, __LINE__, _T("SaveIntoBitmap:can't write into file."));
- }
-
- delete pBmInfo;
- delete pBmfh;
- delete[] pColorTable;
- return TRUE;
- }
- void CBSEImgFileMgr::SetBSEImg(CBSEImgPtr a_poBSE)
- {
- ASSERT(a_poBSE);
- if (!a_poBSE)
- {
- LogErrorTrace(__FILE__, __LINE__, _T("SetBSEImg::invalid BSE image pointer"));
- return;
- }
- m_poBSE = a_poBSE;
-
- }
- //void CBSEImgFileMgr::Serialize(bool isStoring, tinyxml2::XMLDocument * classDoc, tinyxml2::XMLElement * rootNode)
- //{
- // //xmls::xBool xbModify;
- //
- // xmls::xInt xBseImgFileMark;
- // xmls::xString xBseImgFileVersion;
- // //xmls::Collection<CStage> xStagelist;
- // xmls::Slo slo;
- // slo.Register("BseImgFileMark", &xBseImgFileMark);
- // slo.Register("BseImgFileVersion", &xBseImgFileVersion);
- // //slo.Register("BSE", m_poBSE.get());
- // //this->Register("WorkingStageId", &xBseImgFileMark);
- // //this->Register("Stagelist", &xStagelist);
- // //->Register("StageData", m_pStageData.get());
- // if (isStoring)
- // {
- // xBseImgFileMark = BSE_IMG_FILE_MARK;
- // xBseImgFileVersion = BSE_IMG_FILE_VERSION;
- // //xBseImgFileMark = m_nWorkingStageId;
- // slo.Serialize(true, classDoc, rootNode);
- // }
- // else
- // {
- // slo.Serialize(false, classDoc, rootNode);
- // }
- //}
- // protected
- // cleanup
- //void CBSEImgFileMgr::Cleanup()
- //{
- // // need to do nothing at the moment
- //}
- //// initialization
- //void CBSEImgFileMgr::Init(int w,int h)
- //{
- // // initialization
- // m_poBSE = CBSEImgPtr(new CBSEImg(CRect(0,0,w,h)));
- //}
- // duplication
- //void CBSEImgFileMgr::Duplicate(const CBSEImgFileMgr& a_oSource)
- //{
- // // initialization
- // //Init();
- // // copy data over
- // m_poBSE = CBSEImgPtr(new CBSEImg(a_oSource.m_poBSE.get()));
- //}
- }
|