2016-02-19 46 views
0

我需要檢查具有恆定大小(512x512像素)的PNG圖像是否只有白色像素而沒有其他東西。檢查圖像是純白色的嗎?

有沒有一種簡單的方法來做到這一點,最好不手動檢查每個像素?也許使用ImageMagick?

回答

2

我不認爲有一種神奇的方式來確定圖像是否是白色的。

你可能只需要檢查所有像素,但你可以有你的圖像的快速訪問,如果你將其轉換爲位圖和,而不是使用GetPixel(),您使用LockBits()方法鎖定位圖在內存中。然後,您可以使用BitmapData類型並編寫自己的快速GetPixel(),如此處所述:Working with BitmapData

編輯:

其實,我雖然的另一種方法:你可以創建一個同樣大小的純白色圖像,然後通過計算和比較它們的哈希值的圖像進行比較,以那一個。看看這個:Comparing two images

+0

關於比較散列的好主意!有用!謝謝 –

+0

@OlegFilimonov真棒,我很高興! :) – Eutherpy

1

您可以使用Eutherpy答案中所述的方法。如果您想要執行更多圖像操作並且需要高級圖像庫,則可能需要使用我創建的名爲Magick.NET的ImageMagick C#包裝器。

下面是如何,你可以在該庫檢查一個小樣本:

private static bool IsWhite(MagickImage image) 
{ 
    var white = MagickColors.White; 

    using (var pixels = image.GetPixels()) 
    { 
    foreach (var pixel in pixels) 
    { 
     var color = pixel.ToColor(); 
     if (color != white) 
     return false; 
    } 
    } 

    return true; 
} 

static void Main(string[] args) 
{ 
    using (var image = new MagickImage(@"c:\folder\yourimage.png")) 
    { 
    if (IsWhite(image)) 
     Console.WriteLine("The image is all white"); 
    } 
} 
1

從命令行,您可以運行

identify -verbose image 

,尋找

Channel statistics: 
Pixels: 10 
Gray: 
    min: 65535 (1) 
    max: 65535 (1) 
    mean: 65535 (1) 

如果圖像的「min」不是65535,那麼它不是一個完全白色的圖像。

1

通過讓Imagemagick告訴你答案,你可以避免解析,循環和兩步測試。

如果像素的平均爲1.0(它必須是如果所有像素是白色的),並且還寬度爲512,高度爲512,下面將輸出1的測試,否則爲0。

# Test a white 512x512 image => Result: 1 
identify -format "%[fx:(mean==1)&&(w==512)&&(h==512)?1:0]" white.png 
1 

# Test a white 600x512 image => Result: 0 
identify -format "%[fx:(mean==1)&&(w==512)&&(h==512)?1:0]" white600x512.png 
0 

# Test a gray image => Result: 0 
identify -format "%[fx:(mean==1)&&(w==512)&&(h==512)?1:0]" gray90.png 
0