天天看點

GDI+縮放拉伸旋轉圖檔時出現黑邊黑框等問題

之前用GDI+做圖檔旋轉,發現圖檔旋轉後會漂移,偏離原中心位置幾個像素。

後來發現用GDI+的InterpolationModeHighQualityBicubic高品質模式去縮放或者拉伸圖檔時,可能會出現邊緣少幾個像素或者黑邊問題。

解決方法:

Gdiplus::Bitmap dstBmp(nCW, nCH);

Gdiplus::Graphics gdip(&dstBmp);
gdip.SetInterpolationMode(Gdiplus::InterpolationModeHighQualityBicubic);
gdip.SetPixelOffsetMode(Gdiplus::PixelOffsetModeHalf);

Gdiplus::ImageAttributes imgAttr;
imgAttr.SetWrapMode(Gdiplus::WrapModeTileFlipXY);
Gdiplus::Rect rect(0, 0, nCW, nCH);
gdip.DrawImage(pSrcBmp, rect,0,0,pSrcBmp->GetWidth(),pSrcBmp->GetHeight(),Gdiplus::UnitPixel,&imgAttr);
           

通過設定SetInterpolationMode為InterpolationModeHighQualityBicubic,設定SetPixelOffsetMode為PixelOffsetModeHalf,設定ImageAttributes的SetWrapMode為WrapModeTileFlipXY,經過驗證可以解決。

其實黑邊問題如果對圖像品質要求不那麼高,可以設定SetInterpolationMode為InterpolationModeNearestNeighbor,設定SetPixelOffsetMode為PixelOffsetModeNone,應該也能解決。

主要參考:http://webserver2.tecgraf.puc-rio.br/~scuri/gdiplus/drawimage_scale_problem.html

https://blog.csdn.net/chi001/article/details/6076712?utm_medium=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-2.nonecase&depth_1-utm_source=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-2.nonecase

另一種思路放大縮小:https://blog.csdn.net/tianmuxia/article/details/38593349