码迷,mamicode.com
首页 > 其他好文 > 详细

ImageX分块处理和保存

时间:2017-12-08 16:47:31      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:failed   create   ifd   weight   and   span   end   ocr   file   

    COneTif* pOt = new COneTif();
    pOt->m_strTifPath = m_pOt->m_strTifPath;
    if (!pOt->Initilize())
    {
        return;
    }
    const int nBlock = 1024;
    const int& nImgWidth = pOt->m_nImgWidth;
    const int& nImgHeight = pOt->m_nImgHeight;
    const int& nBandNum = pOt->m_nBandNum;
    const int& nBPB = pOt->m_nBPB;
    BYTE* pBlockBufferRead = new BYTE[nImgWidth * nBandNum * nBPB * nBlock];
    BYTE* pBlockBufferWrite = new BYTE[nImgWidth * nBandNum * nBPB * nBlock];
    memset(pBlockBufferRead, 0, sizeof(BYTE)* nImgWidth * nBandNum * nBPB * nBlock);
    memset(pBlockBufferWrite, 0, sizeof(BYTE)* nImgWidth * nBandNum * nBPB * nBlock);
    int nBPP = nBPB * nBandNum;

    IImageX* pImage = nullptr;
    HRESULT hRes = CoCreateInstance(CLSID_ImageDriverX, NULL, CLSCTX_ALL, IID_IImageX, (void**)&pImage);
    if (FAILED(hRes))
    {
        return;
    }

    hRes = pImage->CreateImg(szFileName.GetBuffer(), modeCreate, nImgWidth, nImgHeight, 0, nBandNum, BIP, 0, 0, 1);
    if (hRes == S_FALSE)
    {
        return;
    }

    int nRowBlockNum = (nImgHeight + nBlock - 1) / nBlock;
    for (int j = 0; j < nRowBlockNum; ++j)
    {
        memset(pBlockBufferRead, 0, sizeof(BYTE)* nImgWidth * nBandNum * nBPB * nBlock);
        memset(pBlockBufferWrite, 0, sizeof(BYTE)* nImgWidth * nBandNum * nBPB * nBlock);
        pOt->m_pImage->ReadImg(0, j * nBlock, nImgWidth, j * nBlock + nBlock, pBlockBufferRead, nImgWidth, nBlock, nBandNum, 0, 0, nImgWidth, nBlock, -1, 0);
        for (int m = 0; m < nBlock; m++)
        {
            BYTE *pBufferWriteIndex = pBlockBufferWrite + m * nImgWidth * nBPP;
            BYTE *pBufferBlockIndex = pBlockBufferRead + m * nImgWidth * nBPP;
            for (int n = 0; n < nImgWidth; n++)
            {
                BYTE *pSubBufferWriteIndex = pBufferWriteIndex + n * nBPP;
                BYTE *pSubBufferBlockIndex = pBufferBlockIndex + n * nBPP;

                //对每一个像素进行计算
                if (nBandNum == 3)
                {
                    //此时rgba实际上为rgb,bmp格式存放的是bgr
                    const BYTE* rgba = pSubBufferBlockIndex;
                    double rgb[3];
                    rgb[0] = m_arrWeight[0] * rgba[0] + m_arrWeight[1] * rgba[1] + m_arrWeight[2] * rgba[2];
                    rgb[1] = m_arrWeight[4] * rgba[0] + m_arrWeight[5] * rgba[1] + m_arrWeight[6] * rgba[2];
                    rgb[2] = m_arrWeight[8] * rgba[0] + m_arrWeight[9] * rgba[1] + m_arrWeight[10] * rgba[2];
                    for (int k = 0; k < nBandNum; ++k)
                    {
                        rgb[k] = rgb[k] > 255.0 ? 255.0 : rgb[k];
                        pSubBufferWriteIndex[k] = (BYTE)rgb[k];
                    }
                }
                else if (nBandNum == 4)
                {
                    //加入的调色代码
                    const BYTE* rgba = pSubBufferBlockIndex;
                    double rgb[4];
                    rgb[0] = m_arrWeight[0] * rgba[0] + m_arrWeight[1] * rgba[1] + m_arrWeight[2] * rgba[2] + m_arrWeight[3] * rgba[3];
                    rgb[1] = m_arrWeight[4] * rgba[0] + m_arrWeight[5] * rgba[1] + m_arrWeight[6] * rgba[2] + m_arrWeight[7] * rgba[3];
                    rgb[2] = m_arrWeight[8] * rgba[0] + m_arrWeight[9] * rgba[1] + m_arrWeight[10] * rgba[2] + m_arrWeight[11] * rgba[3];
                    rgb[3] = m_arrWeight[12] * rgba[0] + m_arrWeight[13] * rgba[1] + m_arrWeight[14] * rgba[2] + m_arrWeight[15] * rgba[3];

#ifdef _MATRIX_
                    double ivv[3];
                    RGBtoIHS(rgb[0], rgb[1], rgb[2], ivv);
                    ivv[2] = ivv[2] / 4;
                    IHStoRGB(ivv, rgb);
                    rgb[0] = 16 * sqrt(rgb[0]);
                    rgb[1] = 16 * sqrt(rgb[1]);
                    rgb[2] = 16 * sqrt(rgb[2]);
#endif // _MATRIX_

                    for (int k = 0; k < nBandNum; ++k)
                    {
                        rgb[k] = rgb[k] > 255.0 ? 255.0 : rgb[k];
                        pSubBufferWriteIndex[k] = (BYTE)rgb[k];
                    }
                }
            }
        }
        pImage->WriteImg(0, j * nBlock, nImgWidth, j * nBlock + nBlock, pBlockBufferWrite, nImgWidth, nBlock, nBandNum, 0, 0, nImgWidth, nBlock, -1, 0);
    }

    if (pBlockBufferRead)
    {
        delete[] pBlockBufferRead;
        pBlockBufferRead = nullptr;
    }
    if (pBlockBufferWrite)
    {
        delete[] pBlockBufferWrite;
        pBlockBufferWrite = nullptr;
    }

    delete pOt;
    pOt = nullptr;

    if (pImage != NULL)
    {
        pImage->Close();
        pImage->Release();
        pImage = NULL;
    }

    AfxMessageBox(_T("OK"));

 

ImageX分块处理和保存

标签:failed   create   ifd   weight   and   span   end   ocr   file   

原文地址:http://www.cnblogs.com/autumoonchina/p/8005146.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!