7

c# マネージ GDI+ ライブラリから、c# ビットマップのエッジ空白を検出するためのソリューションを探しています。

画像は透明またはのいずれかで、400x 画像のほとんどは 8000x8000px で、端に約 2000px の余白があります。

エッジ、 x、y、高さ、幅の座標を見つける最も効率的な方法は何ですか? ピクセルごとに移動しようとしましたが、非常に遅いことがわかりました。

ソリューションの更新 -- 左/右/上/下の境界を追加

画像の詳細中央の画像の問題は、透明 (0%) または白 (#FFFFFF) のピクセルをトリミングするようになりました。

var top = bitmap.Height;
var left = bitmap.Width;
var right = 0;
var bottom = 0;

...

var pData = pData0 + (y * data.Stride) + (x * 4);
var xyAlpha = pData[3];
var xyBlue = pData[0];
var xyGreen = pData[1];
var xyRed = pData[2];
if ((xyAlpha > 0) || (xyRed != 255 && xyGreen != 255 && xyBlue != 255)) {
    if (y < top)
        top = y;
    if (y > bottom)
        bottom = y;
    if (x < left)
        left = x;
    if (x > right)
        right = x;
}

...

var cropWidth = right - left;
var cropHeight = bottom - top;
var cropX = top;
var cropY = left;

var cacheBitmap = new Bitmap(cropWidth, cropHeight, PixelFormat.Format32bppArgb);
using (var cacheGraphics = Graphics.FromImage(cacheBitmap)) {
    cacheGraphics.DrawImage(context.Image, new Rectangle(0, 0, cropWidth, cropHeight), cropX, cropY, cropWidth, cropHeight, GraphicsUnit.Pixel);
}
4

2 に答える 2

2

まず、Patrick が説明した LockBits メソッドを必ず使用します。次に、中央の線のピクセルをチェックして、エッジをすばやく判断します。中央の線とは、たとえば 2000x1000 の画像がある場合、最初に水平線番号 500 (1000 のうち) に沿って左右の境界を見つけ、次に垂直線番号 1000 (2000 のうち) に沿って見ていきます。上限と下限を見つけます。このように非常に高速なはずです。

于 2009-02-01T03:26:55.030 に答える