私はどこにでも見ましたが、イメージが空白であるかどうかをチェックする方法の標準(私が見ることができる)はありません。 C#でCでイメージが空白かどうかを確認する#
私はこれを行う方法がありますが、正しい方法は、画像が空白であるかどうかを確認することが大好きですので、誰もが将来知っていることができます。
コードのコピーを貼り付けるつもりはありません。私が欲しいのであれば、私の喜びになりますが、最初に画像が空白かどうかをチェックする方法について説明したいと思います。
あなたは.jpg画像を撮影し、その幅を取得します。例えば500個のピクセル は、次に、2 はあなた
250を与えることによって、あなたはすべてのピクセルの色がの位置にあるかどうか確認する(250幅、及びI高さ)は、反復(のハイトを考えていること分割します画像。
これは、画像のピクセルの中央のラインを垂直方向にチェックすることです。色が何かであるかどうかをすべてのピクセルでチェックしていますが、白以外のものはありません。すべての500 *ピクセルの高さを検索すると、ほとんどの場合、ページの中央に色が表示されます。
その作業...少し遅いです...これを行うより良い方法は? 2/3/4行を垂直方向に検索するように変更すると、空白ではないページを見つける機会が増えますが、それ以上の時間がかかります。
(2つの上の文章や空白のページのサイズとページがお互いに近すぎるため、また、それは何かが、この場合には動作しません含まれているかどうかをチェックするために画像のサイズを使用して、注意してください) 溶液を加えた後。
ソリューションの実装と理解を支援するリソース。
- Writing unsafe code - pointers in Cは
- /unsafe (C# Compiler Options)
- Bitmap.LockBits Method (Rectangle, ImageLockMode, PixelFormat)
ピクセルハンティングを高速化する方法を実装した後、速度はそれほど向上しませんでした。だから私は何か間違っていると思うだろう。
40画像では旧式= 15.63です。
新しい時間= 40枚の画像
のための15.43私はピクセルの集合内のコード「ロック」という、素晴らしい記事DocMax quotedで見ました。 (または私がそれをどのように理解したか) 私がしたことは、各ページの中央のピクセル行にロックされていることです。それが正しい動きだろうか?あなたはそれが間違って得ることのチャンスを許容できる場合
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;
}
そしてクラス
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;
}
時間がかかりましたか?もしそうなら、時間は何でしたか?画像の高さは? – 3aw5TZetdf
あなたのアルゴリズムは私のように思えるので、実装に何か間違っていなければなりません。ビットマップの1つの列をスキャンするのに時間がかかりません。 –
32画像の合計時間= 00:00:12.9187389 高さ= 6552 幅= 4580 – Ruan