📄 grayf.cpp
字号:
Void CFloatImage::mutiplyAlpha (const CFloatImage& fi){ CRct rctIntersect = m_rc; rctIntersect.clip (fi.where()); if (!rctIntersect.valid () || rctIntersect.empty ()) return; PixelF* ppxlfRowStart = (PixelF*) pixels (rctIntersect.left, rctIntersect.top); const PixelF* ppxlfRowStartMask = fi.pixels (rctIntersect.left, rctIntersect.top); for (CoordI iy = rctIntersect.top; iy < rctIntersect.bottom; iy++) { PixelF* ppxlf = ppxlfRowStart; const PixelF* ppxlfMask = ppxlfRowStartMask; for (CoordI ix = rctIntersect.left; ix < rctIntersect.right; ix++) { assert (*ppxlfMask == transpValueF || *ppxlfMask == opaqueValueF); if (*ppxlfMask == transpValueF) { *ppxlf = transpValueF; } else *ppxlf = *ppxlf * *ppxlfMask / opaqueValueF; //normalize ppxlf++; ppxlfMask++; } ppxlfRowStart += where().width; ppxlfRowStartMask += fi.where().width; }}Void CFloatImage::cropOnAlpha (){ CRct rctVisible = whereVisible (); where (rctVisible); }own CFloatImage& CFloatImage::operator += (const CFloatImage& fiSrc){ assert (valid() && fiSrc.valid()); assert (where() == fiSrc.where()); PixelF *ppxlfDst = (PixelF *) pixels(); const PixelF *ppxlfSrc = fiSrc.pixels(); Int i,area = where().area(); for(i=0;i<area;i++) *ppxlfDst++ += *ppxlfSrc++; return *this;}own CFloatImage* CFloatImage::operator + (const CFloatImage& fi) const{ if (!valid () || !fi.valid ()) return NULL; assert (where () == fi.where ()); CFloatImage* pfiSumRet = new CFloatImage (where ()); PixelF* ppxlfRet = (PixelF*) pfiSumRet -> pixels (); const PixelF* ppxlfThis = pixels (); const PixelF* ppxlfFi = fi.pixels (); UInt area = where ().area (); for (UInt ip = 0; ip < area; ip++, ppxlfRet++, ppxlfThis++, ppxlfFi++) *ppxlfRet = *ppxlfThis + *ppxlfFi; return pfiSumRet;}own CFloatImage* CFloatImage::operator - (const CFloatImage& fi) const{ if (!valid () || !fi.valid ()) return NULL; assert (where () == fi.where ()); CFloatImage* pfiSumRet = new CFloatImage (where ()); PixelF* ppxlfRet = (PixelF*) pfiSumRet -> pixels (); const PixelF* ppxlfThis = pixels (); const PixelF* ppxlfFi = fi.pixels (); UInt area = where ().area (); for (UInt ip = 0; ip < area; ip++, ppxlfRet++, ppxlfThis++, ppxlfFi++) *ppxlfRet = *ppxlfThis - *ppxlfFi; return pfiSumRet;}own CFloatImage* CFloatImage::operator * (Float scale) const{ if (!valid ()) return NULL; CFloatImage* pfiSumRet = new CFloatImage (where ()); PixelF* ppxlfRet = (PixelF*) pfiSumRet -> pixels (); const PixelF* ppxlfThis = pixels (); UInt area = where ().area (); for (UInt ip = 0; ip < area; ip++, ppxlfRet++, ppxlfThis++) *ppxlfRet = *ppxlfThis * scale; return pfiSumRet;}own CFloatImage* CFloatImage::operator * (const CTransform& tf) const{ CFloatImage* pfiRet = tf.apply (*this); return pfiRet; }own CFloatImage* CFloatImage::operator / (Float scale) const{ if (!valid ()) return NULL; assert (scale != .0f); CFloatImage* pfiSumRet = new CFloatImage (where ()); PixelF* ppxlfRet = (PixelF*) pfiSumRet -> pixels (); const PixelF* ppxlfThis = pixels (); UInt area = where ().area (); for (UInt ip = 0; ip < area; ip++, ppxlfRet++, ppxlfThis++) *ppxlfRet = *ppxlfThis / scale; return pfiSumRet;}Void CFloatImage::operator = (const CFloatImage& fi){ delete [] m_ppxlf; copyConstruct (fi, fi.where ());}Bool CFloatImage::operator == (const CFloatImage& fi) const{ if (fi.where () != where ()) return FALSE; UInt area = where ().area (); const PixelF* ppxlf = fi.pixels (); const PixelF* ppxlfThis = pixels (); for (UInt ip = 0; ip < area; ip++, ppxlf++, ppxlfThis++) if (*ppxlf != *ppxlfThis) return FALSE; return TRUE;}Double CFloatImage::mse (const CFloatImage& fiCompare) const{ assert (fiCompare.where () == where ()); Double sqr = 0; const PixelF* ppxlfThis = pixels (); const PixelF* ppxlfCompare = fiCompare.pixels (); UInt area = where ().area (); UInt uiNonTransp = 0; for (UInt i = 0; i < area; i++) { Double diffR = (Double) (*ppxlfThis - *ppxlfCompare); sqr += diffR * diffR; uiNonTransp++; ppxlfThis++; ppxlfCompare++; } sqr /= (Double) uiNonTransp; return sqr;}Double CFloatImage::mse (const CFloatImage& fiCompare, const CFloatImage& fiMsk) const{ assert (fiCompare.where () == where () && fiMsk.where () == where ()); Double sqr = 0; const PixelF* ppxlfThis = pixels (); const PixelF* ppxlfCompare = fiCompare.pixels (); const PixelF* ppxlfMsk = fiMsk.pixels (); UInt area = where ().area (); UInt uiNonTransp = 0; for (UInt i = 0; i < area; i++) { if (*ppxlfMsk != transpValue) { Double diffR = (Double) (*ppxlfThis - ((Int) *ppxlfCompare)); sqr += diffR * diffR; uiNonTransp++; } ppxlfThis++; ppxlfCompare++; ppxlfMsk++; } if (uiNonTransp == 0) return 0; sqr /= (Double) uiNonTransp; return sqr;}Double CFloatImage::snr (const CFloatImage& fiCompare) const{ Double msError = 0; msError = mse (fiCompare); if (msError == 0.0) return 1000000.0; else return (log10 (255 * 255 / msError) * 10.0);}Double CFloatImage::snr (const CFloatImage& fiCompare, const CFloatImage& fiMsk) const{ CFloatImage* pfiMskOp = NULL; Double msError = 0; if (&fiMsk == NULL) { pfiMskOp = new CFloatImage (where (), (PixelF) opaqueValue); msError = mse (fiCompare, *pfiMskOp); delete pfiMskOp; } else msError = mse (fiCompare, fiMsk); if (msError == 0.0) return 1000000.0; else return (log10 (255 * 255 / msError) * 10.0);}Void CFloatImage::vdlDump (const Char* fileName) const{ CVideoObjectPlane vop (where (), opaquePixel); CPixel* ppxl = (CPixel*) vop.pixels (); const PixelF* ppxlf = pixels (); UInt area = where ().area (); for (UInt ip = 0; ip < area; ip++, ppxl++, ppxlf++) { U8 vl = (U8) (checkrange (*ppxlf, 0.0f, 255.0f) + 0.5f); *ppxl = CPixel (vl, vl, vl, opaqueValue); } vop.vdlDump (fileName);} Void CFloatImage::dump (FILE* pf) const{ assert (pf != NULL); UInt area = where ().area (); U8* rguchPixelData = new U8 [where().area()]; U8* puch = rguchPixelData; const PixelF* ppxlf = pixels (); for (UInt ip = 0; ip < area; ip++, puch++, ppxlf++) { U8 vl = (U8) checkrange (*ppxlf, 0.0f, 255.0f); *puch = vl; } fwrite (rguchPixelData, sizeof (U8), area, pf); delete [] rguchPixelData;} Void CFloatImage::txtDump (const Char* fileName) const{ FILE* pfTxt; const PixelF* ppxlf = pixels (); if (fileName != NULL) pfTxt = fopen (fileName, "w"); else pfTxt = NULL; for (CoordI y = 0; y < where ().height (); y++) { for (CoordI x = 0; x < where ().width; x++) { if (pfTxt != NULL) fprintf (pfTxt, "%6.2f ", *ppxlf); else printf ("%d ", (Int) *ppxlf); ppxlf++; } if (pfTxt != NULL) fprintf (pfTxt, "\n"); else printf ("\n"); } if (pfTxt != NULL) fclose (pfTxt);}Void CFloatImage::txtDump(FILE *pf) const{ const PixelF *ppxlf = pixels(); for (CoordI y = 0; y < where ().height (); y++) { for (CoordI x = 0; x < where ().width; x++) { fprintf (pf, "%6.2f ", *ppxlf); ppxlf++; } fprintf (pf,"\n"); } fprintf (pf,"\n");}Void CFloatImage::txtDumpMask(FILE *pf) const{ const PixelF *ppxlf = pixels(); for (CoordI y = 0; y < where ().height (); y++) { for (CoordI x = 0; x < where ().width; x++) { if(*ppxlf==transpValue) fprintf (pf, ".."); else fprintf (pf, "[]"); ppxlf++; } fprintf (pf,"\n"); } fprintf (pf,"\n");}Void CFloatImage::quantize (Int stepsize, Bool dpcm){ CoordI x, y; const Int owidth = where ().width; const CoordI left = where ().left; const CoordI top = where ().top; const CoordI right = where ().right; const CoordI bottom = where ().bottom; PixelF* px = (PixelF*) pixels (); if (TRUE){ //Float halfStepsize = (Float) stepsize / 2; for (y = top; y != bottom; y++) { for (x = left; x != right; x++) { //Float round = (*px >= 0) ? halfStepsize : -halfStepsize; //*px++ = (Float) ((Int) ((*px + round) / stepsize)); *px++ = (Float) ((Int) (*px / stepsize)); } } } else { Float halfStepsize = (Float) stepsize / 4; //Float halfStepsize = (Float) stepsize / 2; for (y = top; y != bottom; y++) { for (x = left; x != right; x++) { Float round = (*px >= 0) ? halfStepsize : -halfStepsize; *px++ = (Float) ((Int) ((*px - round) / stepsize)); //*px++ = (Float) ((Int) ((*px + round) / stepsize)); //*px++ = (Float) ((Int) ((*px ) / stepsize)); } } } if (dpcm) { // zig-zag dpcm CFloatImage* buf1 = new CFloatImage (*this); for (y = top; y != bottom; y++) { if (((y - top) & 1) == 0) { // even const Float* pbuf = buf1 -> pixels (left, y); PixelF* psig = (PixelF*) pixels (left, y); *psig++ = (y != top) ? *pbuf - *(pbuf - owidth) : *pbuf; pbuf++; for (x = left + 1; x != right; x++) { *psig = *pbuf - *(pbuf - 1); psig++; pbuf++; } } else { const PixelF* pbuf = buf1 -> pixels (right - 1, y); PixelF* psig = (PixelF*) pixels (right - 1, y); *psig-- = *pbuf - *(pbuf - owidth); pbuf--; for (x = right - 2; x >= left; x--) { *psig = *pbuf - *(pbuf + 1); psig--; pbuf--; } } } delete buf1; }}Void CFloatImage::deQuantize (Int stepsize, Bool dpcm){ CoordI x, y; const Int owidth = where ().width; const CoordI left = where ().left; const CoordI top = where ().top; const CoordI right = where ().right; const CoordI bottom = where ().bottom; if (dpcm) { for (y = top; y != bottom; y++) { if (((y - top) & 1) == 0) { PixelF* psig = (PixelF*) pixels (left, y); if (y != top) *psig += *(psig - owidth); psig++; for (x = left + 1; x != right; x++) { *psig += *(psig - 1); psig++; } } else { PixelF* psig = (PixelF*) pixels (right - 1, y); *psig += *(psig - owidth); psig--; for (x = right - 2; x >= left; x--) { *psig += *(psig + 1); psig--; } } } } Float halfStepsize ; if ( stepsize % 4 == 0) halfStepsize = (Float) stepsize / 2 - 1; else halfStepsize = (Float) stepsize / 2; PixelF* px = (PixelF*) pixels (); for (y = top; y != bottom; y++) { for (x = left; x != right; x++){ //Int round = (*px >= 0) ? (stepsize >> 1) : -(stepsize >> 1); Float round = (*px >= 0) ? (halfStepsize) : -(halfStepsize); *px = (*px == 0)? *px: (*px * (Float) stepsize + round); px++; //*px++ *= (Float) stepsize; } }}Void CFloatImage::roundNearestInt(){ Int i; PixelF fVal,*ppxlf = (PixelF *)pixels(); for(i=where().area();i;i--,ppxlf++) { fVal = *ppxlf; if(fVal>=0) *ppxlf = (PixelF)floor(fVal+0.5); else *ppxlf = (PixelF)ceil(fVal-0.5); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -