1

PDFドキュメントのページを変換するために使用しているAPIから受け取っているHBitmapがあります。結果のビットマップは 24 ビット カラー ビットマップです。PDFに作成された白黒のスキャン画像を使用して、Foxitから得られたビットマップで白黒であることを判断しようとしています。Foxit は PDF API です。ここにいくつかのコードがあります!(c++/cli)

// Get HBITMAP using Foxit's RenderPage function
// to convert to dib later
IntPtr hbitmap = FlattenPageToHBitmap(filename, page);

if (hbitmap == IntPtr::Zero) 
    return IntPtr::Zero;

Bitmap^ b = Bitmap::FromHbitmap(hbitmap);

bool isColor = false;
for (int y = 0; y < b->Height; y++)
{
    for (int x = 0; x < b->Width; x++)
    {
         Color^ c = b->GetPixel(x, y);
         unsigned int bits = (int)c->ToArgb();
         bits = bits << 8;
         bits = bits >> 8; //should get rid of A in ARGB
         bool white = (bits == 0xFFFFFF);
         bool black = (bits == 0);
         if (!black && !white)
         {
        isColor = true;
        break;
         }
    }

    if (isColor)
         break;
    }
}

この HBitmap を取得し、その色を決定したら、HBitmap をデバイスに依存しないビットマップに変換します。このビットマップは、社内のツールキットを使用してさまざまなドキュメント形式に書き戻すことができます。

問題

Foxit から生成された HBitmap は、完全に黒または白のようには見えません。「十分に近い」かどうかを確認して変換するために使用できるアルゴリズムはありますか? ビットマップのピクセル形式は、使用する圧縮を決定するために pdf に保存するときに使用されます。

4

4 に答える 4

6

もちろん、輝度を計算して、それが本当に 0 に近いか 1 に近いかをテストしてください。

Color c = b->GetPixel(x, y); // no ^ because Color is a value type
float Y = (0.2126*c.R + 0.7152*c.G + 0.0722*c.B) / 255;
bool white = (Y > .95);
bool black = (Y < .05);
if (!black && !white)
{
    isColor = true;
    break;
}

ウィキペディアの輝度式を使用します。

または、Y = c.GetBrightness();動作する可能性もあります。

于 2010-11-04T16:06:42.520 に答える
5

すべてのピクセルの R、G、B を取得する方法を知っている場合、BW 画像は R == G == B になるはずです。

そうではなく、グレースケールにしたい場合は、次の式を使用して新しい RGB 値を計算します。

value = 0.3 R + 0.59 G + 0.11 B

R、G、B に値を入力してください。

于 2010-11-04T16:06:11.977 に答える
1

すでに答えが出ていますが、いくつかの魔法の数字が含まれているようです。何らかの奇妙な理由で RGB を使用する必要がある場合に備えて、一般的な、より調整可能なアプローチを次に示します (もちろん、HSV/HSL では簡単であることに気付きました)。

ウィキペディアによると、真の灰色は、赤味 = 緑味 = 青味、つまり RGB 色空間の対角線上にある色です。グレーに近い色も必要なので、対角線の半径 t の管状近傍にある場合、色を at >= 0 のしきい値 t neargrayとして定義します。したがって、RGB カラー x がしきい値 t neargray であるかどうかを判断するには、x とその対角線への正射影との間の距離 r を計算するだけです。r <= t の場合、x は「十分に灰色」です。好みに合わせて t を調整します。

于 2010-11-04T16:15:25.557 に答える
1

非常に暗い灰色(つまり、本質的に黒)または非常に明るい灰色(つまり、本質的に白)の色を使用しているということですか。それとも、ほとんどの (すべてではない) ピクセルが黒または白であることを意味しますか?

まず、「距離」関数を見つけることができます。例えば。距離 = R*R+G*G+B*B. 次に、黒または白の程度を定義するしきい値を選択します。同様に、「黒は R < a && G < a && B < a の場合」と言うことができます。a はしきい値です。

ピクセルに関しては、しきい値を満たすすべてのピクセルをカウントし、(たとえば) 80% 以上がしきい値を満たしているかどうかを判断して、黒または白にすることができます。

于 2010-11-04T16:07:04.933 に答える