本文旨在介紹如何使用易語言編寫對比圖片是否一致的程序。
一、讀取圖片
要想對比兩張圖片是否一致,首先需要將這兩張圖片讀取進來。易語言中可以使用GDI+來讀取圖片。
// 導入GDI+模塊 #include "gdiplus.e" // 讀取圖片 image1 = Gdip_CreateBitmapFromFile("image1.jpg") image2 = Gdip_CreateBitmapFromFile("image2.jpg")
二、獲取圖片大小
得到兩張圖片后,需要先判斷它們是否大小一致。使用GetImageWidth和GetImageHeight可以很容易地獲取圖片的寬度和高度。
// 獲取圖片寬度和高度 w1 = Gdip_GetImageWidth(image1) h1 = Gdip_GetImageHeight(image1) w2 = Gdip_GetImageWidth(image2) h2 = Gdip_GetImageHeight(image2)
三、像素點對比
得到圖片的大小后,接下來需要對比兩張圖片的每一個像素點是否一致??梢允褂肎dip_BitmapLockBits和Gdip_BitmapUnlockBits函數來鎖定位圖的數據。再使用指針遍歷位圖的像素點進行對比。
// 鎖定位圖數據 Gdip_BitmapLockBits(image1, rect, GDIP_IMAGELOCKMODE_READ, pixelFormat, &bitmapData1) Gdip_BitmapLockBits(image2, rect, GDIP_IMAGELOCKMODE_READ, pixelFormat, &bitmapData2) ptr1 = bitmapData1.Scan0 ptr2 = bitmapData2.Scan0 // 遍歷像素點 for(i = 0; i < h1; i++) { for(j = 0; j < w1; j++) { // 獲取像素點信息 pixel1 = *(ptr1 + i * bitmapData1.Stride + j * bytesPerPixel) pixel2 = *(ptr2 + i * bitmapData2.Stride + j * bytesPerPixel) // 判斷像素點是否一致 if(pixel1 != pixel2) { // 不一致,處理方法 } } } // 解鎖位圖數據 Gdip_BitmapUnlockBits(image1, &bitmapData1) Gdip_BitmapUnlockBits(image2, &bitmapData2)
四、處理方法
當發現兩張圖片的像素點不一致時,可以根據需求進行不同的處理方法。如果只需要判斷它們是不是完全一樣,那么只需要在像素點不一致的時候退出循環并給出結果即可。如果需要找到不同的像素點,可以記錄下坐標并且繪制出來。
// 找到不同的像素點 if(pixel1 != pixel2) { // 記錄坐標 diff_x = j diff_y= i // 處理方法 // 繪制不同像素點的框 Gdip_DrawRectangle(graphics, pen, diff_x, diff_y, 1, 1) }
五、完整代碼示例
#include "gdiplus.e" func main() // 初始化GDI+ Gdiplus_Startup() // 讀取圖片 image1 = Gdip_CreateBitmapFromFile("image1.jpg") image2 = Gdip_CreateBitmapFromFile("image2.jpg") // 獲取圖片寬度和高度 w1 = Gdip_GetImageWidth(image1) h1 = Gdip_GetImageHeight(image1) w2 = Gdip_GetImageWidth(image2) h2 = Gdip_GetImageHeight(image2) // 鎖定位圖數據 rect = Gdip_RectF(0, 0, w1, h1) pixelFormat = GDIP_PIXEFORMAT_32BPP_ARGB Gdip_BitmapLockBits(image1, rect, GDIP_IMAGELOCKMODE_READ, pixelFormat, &bitmapData1) Gdip_BitmapLockBits(image2, rect, GDIP_IMAGELOCKMODE_READ, pixelFormat, &bitmapData2) ptr1 = bitmapData1.Scan0 ptr2 = bitmapData2.Scan0 bytesPerPixel = 4 // 初始化畫筆 penColor = RGB(255, 0, 0) penWidth = 1 pen = Gdip_CreatePen1(penColor, penWidth) // 創建用于繪制不同像素點的圖形 graphics = Gdip_CreateFromHDC(GetClientDC(hwnd)) Gdip_SetSmoothingMode(graphics, GDIP_SMOOTHINGMODE_ANTIALIAS) // 遍歷像素點 for(i = 0; i < h1; i++) { for(j = 0; j < w1; j++) { // 獲取像素點信息 pixel1 = *(ptr1 + i * bitmapData1.Stride + j * bytesPerPixel) pixel2 = *(ptr2 + i * bitmapData2.Stride + j * bytesPerPixel) // 判斷像素點是否一致 if(pixel1 != pixel2) { // 記錄坐標 diff_x = j diff_y= i // 處理方法 // 繪制不同像素點的框 Gdip_DrawRectangle(graphics, pen, diff_x, diff_y, 1, 1) } } } // 解鎖位圖數據 Gdip_BitmapUnlockBits(image1, &bitmapData1) Gdip_BitmapUnlockBits(image2, &bitmapData2) // 顯示處理結果 if(diff_x == -1 && diff_y == -1) { MessageBox("兩張圖片完全一致。", "提示") } else { MessageBox("兩張圖片不完全一致,已經標記不同的像素點。", "提示") } // 釋放資源 ReleaseDC(hwnd, graphics) Gdip_DeleteGraphics(graphics) Gdip_DeletePen(pen) Gdip_DisposeImage(image1) Gdip_DisposeImage(image2) // 關閉GDI+ Gdiplus_Shutdown() return 0 endfunc