English 中文(简体)
能够说明哪一个蓝图完全是黑色?
原标题:What s an efficient way to tell if a bitmap is entirely black?

我不禁要问,能否找到一种超高效益的方法,确认图像标语完全是黑色形象,因此,比照图中的每一笔图子是ARGB(255, 0, 0, 0)。

你们会建议什么? 这些比照图大多为1024×6000比克(尽管假定其大小并不总是安全)。

我之所以需要,是因为我们与印巴登彩虹组织有问题。 我们认为,近20%的时间里,至少一部分图像将是黑板(随后的捕获将取得成功)。 我在此工作的想法是,打着“彩礼”或WM_。 维护人权协会与每个儿童窗口一起,把窗户的整个形象一成不变。 如果我能找到一种有效的办法,发现印刷Window为某个儿童窗户归还黑形象,那么我可以很快地把印刷Window再次点上。 彩虹网是抓住窗户的唯一方法(我想说的是,任何途径),支持捕获隐藏和(或)不透的窗户。

彩虹影子如果失败,就没有制定错误代码,也没有归还任何显示失败的东西。 当它有这个黑板的问题时,它总是把整个窗户或儿童窗户 black回黑。 因此,通过分别抓住每个儿童窗口,我可以肯定,我每次捕捉都将奏效,只要其中至少有一个非黑色的灯。

彩虹在Vista 和Va 以上情况较好,但在此情况下,我们只重限于服务器2003年。

最佳回答

I d recommend you to lock the bitmap in the memory using the LockBits method of the System.Drawing.Bitmap type. This method returns the BitmapData type, from which you can receive a pointer to the locked memory region. Then iterate through the memory, searching for the non-zero bytes (really, faster by scanning for the Int32 or even Int64 values, depending on the platform you use). Code will look like this:

// Lock the bitmap s bits.  
Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
BitmapData bmpData =bmp.LockBits(rect, ImageLockMode.ReadWrite, bmp.PixelFormat);

// Get the address of the first line.
IntPtr ptr = bmpData.Scan0;

// Declare an array to hold the bytes of the bitmap.
int bytes  = bmpData.Stride * bmp.Height;
byte[] rgbValues = new byte[bytes];

// Copy the RGB values into the array.
Marshal.Copy(ptr, rgbValues, 0, bytes);

// Scanning for non-zero bytes
bool allBlack = true;
for (int index = 0; index < rgbValues.Length; index++)
    if (rgbValues[index] != 0) 
    {
       allBlack = false;
       break;
    }
// Unlock the bits.
bmp.UnlockBits(bmpData);

考虑使用不安全的法典和直接存取(使用点)来改进业绩。

问题回答

对这个职位的第一个答案是荒谬的。 我修改了该法典,以更加笼统地确定图像是否只有一个色(所有黑色、所有白种、所有魔鬼等等)。 假设你有一张有4个部分彩色价值的比图,如果情况不同,则将每种颜色与左上层的颜色进行比较,那么图象就等于一色。

private bool AllOneColor(Bitmap bmp)
{
    // Lock the bitmap s bits.  
    Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
    BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite, bmp.PixelFormat);

    // Get the address of the first line.
    IntPtr ptr = bmpData.Scan0;

    // Declare an array to hold the bytes of the bitmap.
    int bytes = bmpData.Stride * bmp.Height;
    byte[] rgbValues = new byte[bytes];

    // Copy the RGB values into the array.

    System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);

    bool AllOneColor = true;
    for (int index = 0; index < rgbValues.Length; index++)
    {
        //compare the current A or R or G or B with the A or R or G or B at position 0,0.
        if (rgbValues[index] != rgbValues[index % 4])
        {
            AllOneColor= false;
            break;
        }
    }
    // Unlock the bits.
    bmp.UnlockBits(bmpData);
    return AllOneColor;
}

如果你们更多地了解图象不黑的情况,就会更容易。 例如,图像的边缘或中心在不黑时所看。 基本上,你所创造的就是以非黑色形象进行猜测,并抽样那些能给你最快阅读的领域。 如果你的血清显示一种完全黑色的形象,那么你可以决定它完全是黑白的,也可以完全检查所有ix。 不过,这在很大程度上依赖你的图像。 如果你能够区分一个黑色形象和一个在随机地点含有单一非黑色素的黑色图像,那么你必须检查所有图像。

用在寺院有3×255的科罗塔基绘制的比图,将任何非黑色的粉末冲到纯白色。 然后把该比图引到较小的一张,其宽度为4倍,格式为24bppRgb。 这消除了甲型六氯环己烷,缩小了面积,只剩下零块,如果图形确实是黑色的。

你们不得不尝试,看看你能如何使小幅人绘制比图,使用只有一张白皮的样本,看看谁污染谁会消失。 我对你们的猜测可能相当遥远。

要想到<entirely,确保图像黑白,你就必须检查每台纸浆,在不安全的栏目中获取纸浆数据可能是最快的。 当然,可以优化非黑色案件,并试图先找到这些案例,但在最糟糕的情况下,总是必须检查每个钢板。

只是一些随意的想法:

  • Maybe you could apply a ColorMatrix to the original bitmap (to completely turn it to black). Then compare the result with the original.
  • Or create a bitmap of identical size (filled with pure black) and then compare to the original bitmap.

比较可靠的方法是检查图像的档案规模。 也就是说,如果并非全部黑色的图像分布相对正常,那么这种图像就会出现。

如果你知道档案类型,你知道平均压缩比率的一些基本内容。 并且,在不通过整个档案的情况下,你可以很容易地确定档案的内容。

采用压缩文档格式的所有黑色图像,其尺寸将非常小,而图形的分布则相当正常。

这种方法将花费很少的时间来测试和建立一个知识基础,即把全黑形象的档案规模与非黑色形象相比较,但这种知识是非常迅速的。

如果你有许多非黑色图像与黑色相近的情况,那么这种方法显然不会奏效。

    private bool AllOneColor(Bitmap bmp)
    {
        BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed);
        byte[] rgbValues = new byte[bmpData.Stride * bmpData.Height];
        System.Runtime.InteropServices.Marshal.Copy(bmpData.Scan0, rgbValues, 0, rgbValues.Length);
        bmp.UnlockBits(bmpData);
        return !rgbValues.Where((v, i) => i % bmpData.Stride < bmp.Width && v != rgbValues[0]).Any();
    }

如果图像捕获失败,那么某个地方的指标图象也会如此。





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签