Какой эффективный способ определить, является ли растровое изображение полностью черным? - PullRequest
21 голосов
/ 01 апреля 2010

Мне интересно, существует ли сверхэффективный способ подтверждения того, что объект Image ссылается на полностью черное изображение, поэтому каждый пиксель в растровом изображении имеет ARGB (255, 0, 0, 0).

Что бы вы порекомендовали? Большинство этих растровых изображений будут иметь размер 1024 x 6000 пикселей (хотя предположить, что они всегда будут такого размера, небезопасно).

Мне это нужно, потому что у нас проблемы с API PrintWindow. Мы находим, что почти в 20% случаев, по крайней мере, некоторая часть изображения будет черным квадратом (последующий захват будет успешным). Моя идея обойти эту проблему состояла в том, чтобы вызвать PrintWindow или WM_PRINT с каждым дочерним окном, а затем собрать воедино все изображение окна. Если мне удастся найти эффективный способ определения того, что PrintWindow вернул черное изображение для определенного дочернего окна, тогда я смогу снова быстро вызвать PrintWindow для этого захвата. Это отстой, но PrintWindow - единственный метод захвата окна, который работает во всех окнах (в любом случае, я хочу) и поддерживает захват скрытых и / или неэкранных окон.

При сбое PrintWindow оно не устанавливает код ошибки и не возвращает ничего, что указывает на сбой. Когда возникает проблема с черным квадратом, это всегда все окно или дочернее окно, которое возвращает черный цвет. Таким образом, захватывая каждое дочернее окно отдельно, я могу быть уверен, что каждый из моих снимков будет работать, при условии, что он содержит хотя бы один не черный пиксель.

PrintWindow лучше в Vista и выше, по-видимому, но в этом случае мы ограничены Server 2003.

Ответы [ 12 ]

0 голосов
/ 11 февраля 2015

Один прием, который также может это сделать, - поместить пиксель индикатора где-нибудь, который всегда имеет один и тот же цвет, если только захват изображения не завершится, в этом случае все будет полностью черным, я полагаю

0 голосов
/ 11 февраля 2015
    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();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...