C#圖片處理之:最簡單的柔化演算法
原文http://blog.csdn.net/ki1381/archive/2007/05/10/1603602.aspx
與銳化相反,柔化是使圖片看起來更柔滑(其實也是模糊的委婉的說法)。柔化的一個最簡單的實現演算法就是取圖片上的每一點(圖片邊緣點忽略),計算它周圍八個點的平均值作為新畫素值。想想也是,之所以看起來模糊,確實是因為周圍的點長的有點像,區別不太明顯。
// ============================柔化==============================
/**////
/// 柔化
/// 原始圖
/// 輸出圖
public static Bitmap KiBlur(Bitmap b)
...{
if (b == null)
...{
return null;
}
int w = b.Width;
int h = b.Height;
try
...{
Bitmap bmpRtn = new Bitmap(w, h, PixelFormat.Format24bppRgb);
BitmapData srcData = b.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
BitmapData dstData = bmpRtn.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);
unsafe
...{
byte* pIn = (byte*)srcData.Scan0.ToPointer();
byte* pOut = (byte*)dstData.Scan0.ToPointer();
int stride = srcData.Stride;
byte* p;
for (int y = 0; y < h; y++)
...{
for (int x = 0; x < w; x++)
...{
//取周圍9點的值
if (x == 0 || x == w - 1 || y == 0 || y == h - 1)
...{
//不做
pOut[0] = pIn[0];
pOut[1] = pIn[1];
pOut[2] = pIn[2];
}
else
...{
int r1, r2, r3, r4, r5, r6, r7, r8, r9;
int g1, g2, g3, g4, g5, g6, g7, g8, g9;
int b1, b2, b3, b4, b5, b6, b7, b8, b9;
float vR, vG, vB;
//左上
p = pIn - stride - 3;
r1 = p[2];
g1 = p[1];
b1 = p[0];
//正上
p = pIn - stride;
r2 = p[2];
g2 = p[1];
b2 = p[0];
//右上
p = pIn - stride + 3;
r3 = p[2];
g3 = p[1];
b3 = p[0];
//左側
p = pIn - 3;
r4 = p[2];
g4 = p[1];
b4 = p[0];
//右側
p = pIn + 3;
r5 = p[2];
g5 = p[1];
b5 = p[0];
//右下
p = pIn + stride - 3;
r6 = p[2];
g6 = p[1];
b6 = p[0];
//正下
p = pIn + stride;
r7 = p[2];
g7 = p[1];
b7 = p[0];
//右下
p = pIn + stride + 3;
r8 = p[2];
g8 = p[1];
b8 = p[0];
//自己
p = pIn;
r9 = p[2];
g9 = p[1];
b9 = p[0];
vR = (float)(r1 + r2 + r3 + r4 + r5 + r6 + r7 + r8 + r9);
vG = (float)(g1 + g2 + g3 + g4 + g5 + g6 + g7 + g8 + g9);
vB = (float)(b1 + b2 + b3 + b4 + b5 + b6 + b7 + b8 + b9);
vR /= 9;
vG /= 9;
vB /= 9;
pOut[0] = (byte)vB;
pOut[1] = (byte)vG;
pOut[2] = (byte)vR;
}
pIn += 3;
pOut += 3;
}// end of x
pIn += srcData.Stride - w * 3;
pOut += srcData.Stride - w * 3;
} // end of y
}
b.UnlockBits(srcData);
bmpRtn.UnlockBits(dstData);
return bmpRtn;
}
catch
...{
return null;
}
} // end of KiBlur
/**////
/// 柔化
/// 原始圖
///
public static Bitmap KiBlur(Bitmap b)
...{
if (b == null)
...{
return null;
}
int w = b.Width;
int h = b.Height;
try
...{
Bitmap bmpRtn = new Bitmap(w, h, PixelFormat.Format24bppRgb);
BitmapData srcData = b.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
BitmapData dstData = bmpRtn.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);
unsafe
...{
byte* pIn = (byte*)srcData.Scan0.ToPointer();
byte* pOut = (byte*)dstData.Scan0.ToPointer();
int stride = srcData.Stride;
byte* p;
for (int y = 0; y < h; y++)
...{
for (int x = 0; x < w; x++)
...{
//取周圍9點的值
if (x == 0 || x == w - 1 || y == 0 || y == h - 1)
...{
//不做
pOut[0] = pIn[0];
pOut[1] = pIn[1];
pOut[2] = pIn[2];
}
else
...{
int r1, r2, r3, r4, r5, r6, r7, r8, r9;
int g1, g2, g3, g4, g5, g6, g7, g8, g9;
int b1, b2, b3, b4, b5, b6, b7, b8, b9;
float vR, vG, vB;
//左上
p = pIn - stride - 3;
r1 = p[2];
g1 = p[1];
b1 = p[0];
//正上
p = pIn - stride;
r2 = p[2];
g2 = p[1];
b2 = p[0];
//右上
p = pIn - stride + 3;
r3 = p[2];
g3 = p[1];
b3 = p[0];
//左側
p = pIn - 3;
r4 = p[2];
g4 = p[1];
b4 = p[0];
//右側
p = pIn + 3;
r5 = p[2];
g5 = p[1];
b5 = p[0];
//右下
p = pIn + stride - 3;
r6 = p[2];
g6 = p[1];
b6 = p[0];
//正下
p = pIn + stride;
r7 = p[2];
g7 = p[1];
b7 = p[0];
//右下
p = pIn + stride + 3;
r8 = p[2];
g8 = p[1];
b8 = p[0];
//自己
p = pIn;
r9 = p[2];
g9 = p[1];
b9 = p[0];
vR = (float)(r1 + r2 + r3 + r4 + r5 + r6 + r7 + r8 + r9);
vG = (float)(g1 + g2 + g3 + g4 + g5 + g6 + g7 + g8 + g9);
vB = (float)(b1 + b2 + b3 + b4 + b5 + b6 + b7 + b8 + b9);
vR /= 9;
vG /= 9;
vB /= 9;
pOut[0] = (byte)vB;
pOut[1] = (byte)vG;
pOut[2] = (byte)vR;
}
pIn += 3;
pOut += 3;
}// end of x
pIn += srcData.Stride - w * 3;
pOut += srcData.Stride - w * 3;
} // end of y
}
b.UnlockBits(srcData);
bmpRtn.UnlockBits(dstData);
return bmpRtn;
}
catch
...{
return null;
}
} // end of KiBlur
當然這是最簡單的一種,不支援柔化半徑選擇。實際中通常需要自定義模糊的程度,這個下回再談。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-462848/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 圖形影像處理之簡單圖片
- C#圖片處理之:給你的圖片打上LOGOC#Go
- 圖片處理擴充套件 Grafika 的簡單使用套件
- C#圖片處理函式C#函式
- 圖片處理擴充套件 Intervention/image 的簡單使用套件
- 包含(處理)HTML的最簡單方法包括HTML
- 簡單的圖片處理器(設定色相,亮度,飽和度)
- Rust中錯誤處理的最簡單指南Rust
- 實現一個簡單的基於 WebAssembly 的圖片處理應用Web
- android簡單的圖形特效處理Android特效
- 原生JS實現最簡單的圖片懶載入JS
- 原生 JS 實現最簡單的圖片懶載入JS
- webpack圖片處理Web
- Thumbnailator處理圖片AI
- iOS 圖片處理iOS
- 圖片上傳及圖片處理
- 簡單的字串處理字串
- 簡單的文字處理
- 串的簡單處理
- 【YLCircleImageView】圖片處理View
- 002.00 圖片處理
- 圖片處理--羽化特效特效
- SwiftUI Image 圖片處理SwiftUI
- 安卓之viewPager簡單用法圖片輪播安卓Viewpager
- 攻防世界-簡單的圖片
- 走近webpack(3)–圖片的處理Web
- DDGScreenShot —iOS 圖片處理--多圖片拼接 (swift)iOSSwift
- 圖片編輯工具:FotoJet Photo Editor更好的處理圖片
- 處理圖片流資料
- Python批量處理圖片Python
- java 圖片水印處理類Java
- JavaScript WebGL 圖片透明處理JavaScriptWeb
- Golang 圖片處理 — image 庫Golang
- webpack(6)webpack處理圖片Web
- java thumbnailator 做圖片處理JavaAI
- photoshop常用圖片處理技巧
- webpack 圖片處理 loaderWeb
- OpenCv--圖片處理操作OpenCV