C#影象處理實踐——圖片不同提取
阿新 • • 發佈:2019-02-07
有時候會遇到有兩張幾乎完全相同的圖片,但其中一張會多一些東西,比如logo、花紋等。此程式可以找到這些不同,將圖片不同的畫素放到另一張圖片上
例如:
程式介面如下圖
點選檔案1按鈕載入第一個圖片,檔案2同理,點選【開始比較】按鈕,會生成一張新的圖片,即兩個圖片之間的差異(檔案1多於檔案2的部分)
主要問題在對於圖片畫素的處理(按下【開始比較】按鈕的處理)
程式壓縮包見如下連結
http://download.csdn.net/detail/u013218907/9500550
核心程式碼如下:
private void btnStartCompare_Click(object sender, EventArgs e)
{
Bitmap bitmap1 = (Bitmap)Bitmap.FromFile(this .tbxFilePath1.Text, false);
Bitmap bitmap2 = (Bitmap)Bitmap.FromFile(this.tbxFilePath2.Text, false);
Bitmap diffBitmap = createBitmap(bitmap1.Width, bitmap1.Height);
//檢查圖片
if (!checkBitmap(bitmap1, bitmap2))
{
MessageBox.Show(this , "圖片有問題", "警告",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
compareBitmap(bitmap1, bitmap2, diffBitmap);
try
{
diffBitmap.Save("diff.png");
}
catch (Exception)
{
MessageBox.Show(this , "儲存圖片時發生錯誤〒_〒", "出錯了",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
MessageBox.Show(this, "成功完成圖片處理~", "成功了!!!",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
private bool checkBitmap(Bitmap bitmap1, Bitmap bitmap2)
{
if (bitmap1 == null || bitmap2 == null) {
return false;
}
if (bitmap1.Width != bitmap2.Width || bitmap1.Height != bitmap2.Height)
{
return false;
}
return true;
}
private void compareBitmap(Bitmap bitmap1, Bitmap bitmap2, Bitmap diffBitmap)
{
Color color1;
Color color2;
int wide = bitmap1.Width;
int height = bitmap1.Height;
for (int y = 0; y < height; y++)
{
for (int x = 0; x < wide; x++)
{
//獲取畫素的RGB顏色值
color1 = bitmap1.GetPixel(x, y);
color2 = bitmap2.GetPixel(x, y);
if (color1 != color2)
{
diffBitmap.SetPixel(x, y, color1);
}
}
}
return;
}
private Bitmap createBitmap(int wight, int height)
{
Bitmap bitmap = new Bitmap(wight, height);
bitmap.MakeTransparent(Color.Transparent);
return bitmap;
}
public static Bitmap RGB2Gray(Bitmap srcBitmap)
{
Color srcColor;
int wide = srcBitmap.Width;
int height = srcBitmap.Height;
for (int y = 0; y < height; y++)
for (int x = 0; x < wide; x++)
{
//獲取畫素的RGB顏色值
srcColor = srcBitmap.GetPixel(x, y);
byte temp = (byte)(srcColor.R * .299 + srcColor.G * .587 + srcColor.B * .114);
//設定畫素的RGB顏色值
srcBitmap.SetPixel(x, y, Color.FromArgb(temp, temp, temp));
}
return srcBitmap;
}
}