Tôi đã xem ở khắp mọi nơi nhưng có vẻ như không phải là tiêu chuẩn (tôi có thể thấy) về cách một hình ảnh sẽ kiểm tra xem hình ảnh có trống không. Trong C#Kiểm tra xem hình ảnh có trống trong C#
Tôi có cách để làm điều này, nhưng rất muốn biết cách chính xác là kiểm tra xem hình ảnh có trống không, vì vậy mọi người cũng có thể biết trong tương lai.
Tôi sẽ không sao chép dán một loạt mã vào, nếu bạn muốn tôi, nó sẽ là niềm vui của tôi, nhưng tôi chỉ muốn giải thích cách tôi kiểm tra xem hình ảnh có trống không.
Bạn chụp ảnh .jpg, Nhận chiều rộng của ảnh. Ví dụ: 500 pixel Sau đó, bạn chia số đó theo 2 cho bạn 250
Sau đó, bạn kiểm tra màu của mỗi pixel ở vị trí (250 chiều rộng và chiều cao i) (nơi bạn lặp lại nghĩ rằng cao điểm của
Điều này chỉ làm là kiểm tra đường giữa của các điểm ảnh của một hình ảnh, theo chiều dọc.Theo mặc dù tất cả các điểm ảnh kiểm tra xem màu đó có là gì không Ngoại trừ màu trắng. để tìm kiếm TẤT CẢ 500 * chiều cao của pixel và vì bạn hầu như luôn luôn bắt gặp màu ở giữa trang.
Hoạt động của nó ... hơi chậm ... Phải có cách tốt hơn để làm điều này? Bạn có thể thay đổi nó để tìm kiếm 2/3/4 dòng theo chiều dọc để tăng cơ hội phát hiện một trang không trống, nhưng điều đó sẽ mất nhiều thời gian hơn.
(Cũng lưu ý, sử dụng kích thước của hình ảnh để kiểm tra xem nó có chứa một cái gì đó sẽ không làm việc trong trường hợp này, vì một trang có hai câu trên và kích thước một trang trống là quá gần nhau)
Sau khi giải pháp đã được thêm vào.
Tài nguyên để giúp triển khai và hiểu rõ giải pháp.
- Writing unsafe code - pointers in C
- Using Pointers in C#
- /unsafe (C# Compiler Options)
- Bitmap.LockBits Method (Rectangle, ImageLockMode, PixelFormat)
(Lưu ý rằng trên trang web đầu tiên, Pizelformat tuyên bố thực sự là Pixelformat) - Lỗi nhỏ tôi biết, chỉ cần nhắc đến, có thể gây nhầm lẫn cho một số người.
Sau khi tôi triển khai phương pháp để tăng tốc độ săn pixel, tốc độ không tăng nhiều. Vì vậy, tôi sẽ nghĩ rằng tôi đang làm điều gì đó sai trái.
Thời gian cũ = 15,63 cho 40 hình ảnh.
giờ New = 15.43 40 hình ảnh
tôi thấy với bài viết tuyệt vời DocMax quoted, rằng mã "khóa" trong một bộ pixel. (hoặc đó là cách tôi hiểu nó) Vì vậy, những gì tôi đã làm là khóa ở hàng giữa pixel của mỗi trang. Đó có phải là động thái đúng để làm?
private int testPixels(String sourceDir)
{
//iterate through images
string[] fileEntries = Directory.GetFiles(sourceDir).Where(x => x.Contains("JPG")).ToArray();
var q = from string x in Directory.GetFiles(sourceDir)
where x.ToLower().EndsWith(".jpg")
select new FileInfo(x);
int holder = 1;
foreach (var z in q)
{
Bitmap mybm= Bitmap.FromFile(z.FullName) as Bitmap;
int blank = getPixelData2(mybm);
if (blank == 0)
{
holder = 0;
break;
}
}
return holder;
}
Và sau đó các lớp
private unsafe int getPixelData2(Bitmap bm)
{
BitmapData bmd = bm.LockBits(new System.Drawing.Rectangle((bm.Width/2), 0, 1, bm.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, bm.PixelFormat);
int blue;
int green;
int red;
int width = bmd.Width/2;
for (int y = 0; y < bmd.Height; y++)
{
byte* row = (byte*)bmd.Scan0 + (y * bmd.Stride);
blue = row[width * 3];
green = row[width * 2];
red = row[width * 1];
// Console.WriteLine("Blue= " + blue + " Green= " + green + " Red= " + red);
//Check to see if there is some form of color
if ((blue != 255) || (green != 255) || (red != 255))
{
bm.Dispose();
return 1;
}
}
bm.Dispose();
return 0;
}
Bạn đã hẹn giờ phải mất bao lâu? Nếu vậy, thời gian và chiều cao của hình ảnh là bao nhiêu? – 3aw5TZetdf
Bạn phải làm điều gì đó sai trong việc thực hiện của bạn, bởi vì thuật toán của bạn dường như âm thanh với tôi. Sẽ không mất thời gian để quét xuống một cột bitmap. –
Tổng thời gian cho 32 hình ảnh = 00: 00: 12.9187389 Chiều cao = 6552 Chiều rộng = 4580 – Ruan