Thuật toán đơn giản để kiểm tra màu: Đi theo pixel ảnh theo pixel trong vòng lặp (chiều rộng và chiều cao) và kiểm tra xem liệu giá trị RGB của pixel có bằng nhau hay không. Nếu không thì hình ảnh có thông tin màu. Nếu bạn làm cho nó tất cả các cách thông qua tất cả các điểm ảnh mà không gặp phải tình trạng này, sau đó bạn có một hình ảnh quy mô màu xám.
sửa đổi với một thuật toán phức tạp hơn:
Trong rev đầu tiên của bài viết này tôi đề xuất một thuật toán đơn giản mà giả định rằng pixel là quy mô màu xám nếu RGB của mỗi điểm ảnh là những giá trị đều bình đẳng. Vì vậy, RGB của 0,0,0 hoặc 128,128,128 hoặc 230,230,230 tất cả sẽ kiểm tra như màu xám trong khi 123,90,78 sẽ không. Đơn giản.
Đây là đoạn mã kiểm tra phương sai từ màu xám. Hai phương pháp là một phần nhỏ của một quy trình phức tạp hơn nhưng phải cung cấp đủ mã thô để trợ giúp với câu hỏi ban đầu.
/// <summary>
/// This function accepts a bitmap and then performs a delta
/// comparison on all the pixels to find the highest delta
/// color in the image. This calculation only works for images
/// which have a field of similar color and some grayscale or
/// near-grayscale outlines. The result ought to be that the
/// calculated color is a sample of the "field". From this we
/// can infer which color in the image actualy represents a
/// contiguous field in which we're interested.
/// See the documentation of GetRgbDelta for more information.
/// </summary>
/// <param name="bmp">A bitmap for sampling</param>
/// <returns>The highest delta color</returns>
public static Color CalculateColorKey(Bitmap bmp)
{
Color keyColor = Color.Empty;
int highestRgbDelta = 0;
for (int x = 0; x < bmp.Width; x++)
{
for (int y = 0; y < bmp.Height; y++)
{
if (GetRgbDelta(bmp.GetPixel(x, y)) <= highestRgbDelta) continue;
highestRgbDelta = GetRgbDelta(bmp.GetPixel(x, y));
keyColor = bmp.GetPixel(x, y);
}
}
return keyColor;
}
/// <summary>
/// Utility method that encapsulates the RGB Delta calculation:
/// delta = abs(R-G) + abs(G-B) + abs(B-R)
/// So, between the color RGB(50,100,50) and RGB(128,128,128)
/// The first would be the higher delta with a value of 100 as compared
/// to the secong color which, being grayscale, would have a delta of 0
/// </summary>
/// <param name="color">The color for which to calculate the delta</param>
/// <returns>An integer in the range 0 to 510 indicating the difference
/// in the RGB values that comprise the color</returns>
private static int GetRgbDelta(Color color)
{
return
Math.Abs(color.R - color.G) +
Math.Abs(color.G - color.B) +
Math.Abs(color.B - color.R);
}
Nguồn
2009-12-09 22:36:43
Kiểm tra loại hình ảnh sẽ không cắt vì nó sẽ được đặt trong 24 hoặc 32 bit (vì bạn đang quét màu). Có thể bạn sẽ phải kiểm tra từng pixel; nếu R == G == B trong tất cả các pixel, đó là hình ảnh thang độ xám, nếu không nó có thể là màu. –
Suy nghĩ: Mặc dù máy quét trong lý thuyết đang cung cấp R == G == B, có thể là trong quá trình nén JPEG, có thể có một số điểm ảnh mà chỉ gần như đúng? Hãy xem xét, JPEG là một thuật toán nén mất dữ liệu. Có lẽ JPEG mất một số quyền tự do với màu pixel gần đó. Nhưng tôi thú nhận, tôi không phải là một chuyên gia về JPEG. Nhưng tôi muốn biết làm thế nào nó hoạt động trước khi tôi dựa vào R == G == B. –
Vâng, tôi ghét phải dựa vào chính xác r == g == b bởi vì ngay cả khi jpg không làm bất kỳ fudging (và tôi đặt cược nó), máy quét của bạn và bản gốc sẽ phải được hoàn hảo là tốt, mà tấn công tôi như không có trong nhiều trường hợp. – Beska