Чужое окно монохромно в Picturebox (BitBlt) - странности

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
giaber
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 14.01.2009 (Ср) 13:51

Чужое окно монохромно в Picturebox (BitBlt) - странности

Сообщение giaber » 12.02.2015 (Чт) 16:49

Задача - получить в Picture2 монохромную картинку открытой в Файрфоксе страницы. Код с просторов инета в принципе работает, но со странностями - именно файрфоксовские страницы не показываются, окна некоторых прог и папок тоже. Пробовал два варианта - брать GetDC(0) и второй - определять hwnd нужного окна. Оба варианта не работают с файрфоксом, Picture2 просто заполняется сплошным чёрным цветом. То есть - в Picture1 цветное изображение появляется. а в Picture2 просто чернота.

Код: Выделить всё
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal _
   xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Const SRCCOPY = &HCC0020
Private Declare Function SetBkColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long
Private bwDC As Long
Private bwBmp As Long
Private bwBmpOld As Long
Private TransparentColor As Long
Private W As Integer
Private H As Integer

Private Sub Command1_Click()
        W = 500 * 15
        H = 200 * 15
        TransparentColor = 16777215 'мне нужен белый

        ' Varian 2 - by hwnd----------------------------------------------------------
        ' deskHWND = FindWindow(vbNullString, "Roulette - Mozilla Firefox")
        ' deskDC = GetWindowDC(deskDC)
        '--------------------------------------------------------------------------------
       
        ' Varian 1 - desktop DC------------------------------------------------------
        deskDC = GetDC(0)
        BitBlt Picture1Picture1.hdc, 0, 0, W, H, deskDC, 0, 0, SRCCOPY 'десктоп в Picture1
        Picture1.Refresh
        '
        ' Create a monochrome DC & Bitmap of the same size as the source picture:
        bwDC = CreateCompatibleDC(0)
        bwBmp = CreateCompatibleBitmap(bwDC, W, H)
        bwBmpOld = SelectObject(bwDC, bwBmp)
        '
        ' Set the back 'colour' of the monochrome DC to the colour we wish to be transparent:
        SetBkColor bwDC, TransparentColor
        '
        ' Copy from the from picture to the monochrome DC to create the mask:
        BitBlt bwDC, 0, 0, W, H, Picture1.hdc, 0, 0, SRCCOPY
        '
        ' Now put the mask into Picture2:
        BitBlt Picture2.hdc, 0, 0, W, H, bwDC, 0, 0, SRCCOPY
        Picture2.Refresh
        '
        ' Clear up the bitmap we used to create the mask:
        SelectObject bwDC, bwBmpOld
        DeleteObject bwBmp
        '
        ' Clear up the monochrome DC:
        DeleteObject bwDC
        '
End Sub


1й вопрос - что я не догоняю? в чём мой косяк?
2й вопрос - как избавиться от промежуточного BitBlt в Picture1, то есть как прямо передать сграбленную картинку в монохромный bwDC?

Заранее благодарен!
Вложения
Monochrome Desktop.JPG
Вот как это выглядит
Monochrome Desktop.JPG (77.18 Кб) Просмотров: 6307

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Чужое окно монохромно в Picturebox (BitBlt) - странности

Сообщение Хакер » 12.02.2015 (Чт) 20:10

Какой грязный код.

Не работает он, очевидно, потому что тут мы видим блек-кодинг: для постеризации использует побочный эффект от работы функции BitBlt при копировании растра между разнородными устройствами. Разве где-то задокументировано, как должна вести себя функция BitBlt при копировании растра из цветного устройства в монохромное, и что её можно использовать для постеризации. Раз нигде официально не зафиксирована такая возможность, не надо её использовать.

Кроме того, шаг к успеху — это контроль кодов возвратов и кодов ошибок после вызова API-функций.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

giaber
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 14.01.2009 (Ср) 13:51

Чужое окно монохромно в Picturebox (BitBlt) - странности

Сообщение giaber » 12.02.2015 (Чт) 20:19

Ту вообще страньше и страньше! Посмотрите рисунок - окно файрфокса частично перекрывает окно Paint. Делаю PrintScreen клавишей клавиатуры, В моей проге делаю Picture1.Picture = Clipboard.GetData, то есть в Picture1 картинка попадает без моих deskDC = GetDC(0) и прочее, затем прога переносит содержимое Picture1 в bwDC: BitBlt bwDC, 0, 0, W, H, Picture1.hdc, 0, 0, SRCCOPY и в результате та часть содержимого Clipboard, которая принадлежала Paint конвертится в чб, а та часть которая принадлежала файрфоксу - нет! Белые точки на цифрах в окне файрфокса точно есть! Это только меня, ламера, удивляет?
Вложения
Monochrome Desktop 2.JPG
Monochrome Desktop 2.JPG (42.71 Кб) Просмотров: 6292

giaber
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 14.01.2009 (Ср) 13:51

Re: Чужое окно монохромно в Picturebox (BitBlt) - странности

Сообщение giaber » 12.02.2015 (Чт) 20:27

Уважаемый Хакер! Дело в том что я совершенный ламер, за два дня ворошения интернета не нашёл ничего другого - даже у микрософта этот же принцип. Два дня не образно - буквально не отрываясь, просмотрел наверное сотни две-три страниц разных. Никакого другого принципа я не нашёл. Может вы что-нибудь посоветуете? Как ещё можно создать маску изображения? или другими словами сконвертировать в чб

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Чужое окно монохромно в Picturebox (BitBlt) - странности

Сообщение Хакер » 12.02.2015 (Чт) 20:45

giaber писал(а):Это только меня, ламера, удивляет?

Нет.
Повторяю: где написано, что BitBlt при копировании растра между разнородными устройствами должна вести себя каким-нибудь определённым образом и давать предсказуемые результаты? Да она может давать какие угодно результаты. Результат операций над разнородными устройствами просто не определён.

Теперь что касается объяснения. В отличие от device-independent-ресурсов, device-dependant-ресурсы относятся непосредствено к видеопамяти. Иными словами, все эти HDC, начиная от нулевого и вплоть до тех, которые возвращаются свойством PictureN.hDC — это непосредственно интерфейс к видеопамяти, и все манипуляции над растром в через эти DC сводятся к операциям над битами в видеопамяти.

Если посмотреть дальше, то нужно, очевидно, задуматься об организации видеопамяти и устройстве, вернее, о формате пикселя. Если мы имеем 4-байтные пиксели (с альфаканалом), то очевидно, что значение четвёртого байта сохраняется при копировании растра (с помощью BitBlt), и только при попытке скопировать растр в несовместимое по организации пикселя устройство (монохромное in-memory DC) оно вносит свой негативный вклад.

Кроме того, это первые десять с лишним лет GDI-операции работали напрямую с видеопамятью (если хендл DC относится к DC которое относится к устройству «Дисплей»), а начиная с Windows Vista они накрутили вокруг графической подсистемы, и теперь все операции работают через прослойку-посредника.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Чужое окно монохромно в Picturebox (BitBlt) - странности

Сообщение Хакер » 12.02.2015 (Чт) 20:48

giaber писал(а):или другими словами сконвертировать в чб

Это называется постеризация. И примеров, я уверен, тьма, если искать по этому слову.

Чтобы чётко ответить на вопрос «как сконвертировать в чб», надо сначала ответить на вопрос: а по какому правилу выбирается, будет ли исходная цветная точка превращена в чёрную или в белую?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

giaber
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 14.01.2009 (Ср) 13:51

Re: Чужое окно монохромно в Picturebox (BitBlt) - странности

Сообщение giaber » 12.02.2015 (Чт) 21:10

"о формате пикселя. Если мы имеем 4-байтные пиксели" - вот оно как, Михалыч!(с). Спасибо за объяснения - немного прояснилось почему оно так происходит, осталось мне понять что же делать...
"Это называется постеризация. И примеров, я уверен, тьма, если искать по этому слову." - вот как раз по этому слову и не искал, теперь буду.
"а по какому правилу выбирается, будет ли исходная цветная точка превращена в чёрную или в белую?" - мне надо чтоб всё, что на рисунке не белый цвет, становилось любым другим (лучше всего чёрным), то есть в итоговом изображении должно быть два цвета, в принципе - любые два, но удобней всего чёрный и белый. Мне надо получить сумму пикселей и удобней, думаю, чёрный и белый.Но я вс же подробней задачу опишу - может вы посоветуете кардинально другой путь. Проблема такая - мне надо считывать эти цифры и определять, какая именно цифра появилась на экране. Сложность в том, что видимо для защиты, рандомно на 1-2 пикселя:
1. меняются размеры серых и красных квадратиков-фонов
2. меняется чуть-чуть цвет крайних верт рядов пикселей -1й и последний
3. меняются промежутки между квадратиками
4. меняется положение цифры на квадратике
но сами цифирки, во всяком случае белые точки не изменяются и их взаиморасположение также не меняется. Поэтому я решил убрать цветность, суммировать значения пикселейи тогда каждому квадратику с цифрой будет соответствовать конкретная сумма, позволяющая определить цифру.
Вложения
0.JPG
0.JPG (8.07 Кб) Просмотров: 6285

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Чужое окно монохромно в Picturebox (BitBlt) - странности

Сообщение Хакер » 12.02.2015 (Чт) 21:28

giaber писал(а):мне надо чтоб всё, что на рисунке не белый цвет

А что считать белым? Только точку с цветовыми компонентами 255:255:255?

giaber писал(а):уммировать значения пикселейи тогда каждому квадратику с цифрой будет соответствовать конкретная сумма, позволяющая определить цифру.

Способ — дрянь. Простое рассуждение наводит на мысль, что цифры 6 и 9 друг от друга таким способом не отличить.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

giaber
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 14.01.2009 (Ср) 13:51

Re: Чужое окно монохромно в Picturebox (BitBlt) - странности

Сообщение giaber » 12.02.2015 (Чт) 21:38

Только точку с цветовыми компонентами 255:255:255?

да
Способ — дрянь. Простое рассуждение наводит на мысль, что цифры 6 и 9 друг от друга таким способом не отличить.

ну, можно дополнительную проверку организовать... не спорю - не лучший наверное способ, а вы бы что посоветовали? в каком направлении мне копать?

вот если есть апи в которых можно задавать глубину цвета, как например в LoadPicture([FileName], [Size], [ColorDepth],[X,Y]) ...

конечно было бы правильней всего наверное перехватывать трафик - на комп ведь присылается инфа чтоб изменения на экране произошли - но при моём ламерстве это недостижимо, наверное
Последний раз редактировалось giaber 12.02.2015 (Чт) 21:41, всего редактировалось 1 раз.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Чужое окно монохромно в Picturebox (BitBlt) - странности

Сообщение Хакер » 12.02.2015 (Чт) 21:39

giaber писал(а):ну, можно дополнительную проверку организовать... не спорю - не лучший наверное способ, а вы бы что посоветовали? в каком направлении мне копать?

По распознованию текста написана куча трудов, статей, примеров и прочего. От мипмап-индексирования до применения нейронных сетей.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

giaber
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 14.01.2009 (Ср) 13:51

Re: Чужое окно монохромно в Picturebox (BitBlt) - странности

Сообщение giaber » 12.02.2015 (Чт) 21:47

Хакер! при всём моём к вам УВАЖЕНИИ - вы даёте нереальные планы! мне, 56 летнему гуманитарию с не алгоритмическим мышлением начать изучать OCR? это фантастика! :D
вот был у меня активикс оцрный, бесплатный, работал нормально. Но винт полетел и теперь я не могу найти его в сети - даже названия не помню

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Чужое окно монохромно в Picturebox (BitBlt) - странности

Сообщение The trick » 12.02.2015 (Чт) 21:57

Юзай GetDiBits и в цикле проходи по пикселям оставляя то что тебе нужно.
Также в GDI+ уже есть готовые эффекты, а также цветовые матрицы.
UA6527P

giaber
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 14.01.2009 (Ср) 13:51

Re: Чужое окно монохромно в Picturebox (BitBlt) - странности

Сообщение giaber » 12.02.2015 (Чт) 22:04

Да циклами я и так делаю GetPixel-ем, хочу как раз избавиться, свалить работу на апи, ускорить, упростить
А вот такая просьба - можете объяснить, как происходит "монохромизация" - какова последовательность ROP операций и каких, чтоб в итоге получилось монохромное, или это по другому делается? перебором тоже? на низком уровне просто? Мне проще и быстрее 5-10 раз BitBlt с изображением провести, чем переборы делать, всё равно быстрее будет.
Последний раз редактировалось giaber 12.02.2015 (Чт) 22:10, всего редактировалось 1 раз.

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Чужое окно монохромно в Picturebox (BitBlt) - странности

Сообщение The trick » 12.02.2015 (Чт) 22:09

Через GetPixel - нельзя. Через GetDiBits будет достаточно быстро. Насчет API - я написал можешь использовать GDI+.
Вот стандартные эффекты.
Также можешь использовать ImageAttributes - функции.
UA6527P

giaber
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 14.01.2009 (Ср) 13:51

Re: Чужое окно монохромно в Picturebox (BitBlt) - странности

Сообщение giaber » 12.02.2015 (Чт) 22:13

Спасибо, The trick! буду изучать темы эти, но по ROP-операциям можете подсказать что-нибудь?

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 13.02.2015 (Пт) 13:08

giaber, судя по описанию, подойдёт простейшее распознавание сравнением с образцом. Делал такое.

Подготовительная часть:
  1. Определяем эталонный размер цифры
    Этот размер представляет некий bounding box символа и должен быть адекватным большинству символов
  2. Для каждой цифры делаем её эталонную картинку (цифра белая, фон чёрный, других цветов нет)
    Картинка должна быть эталонного размера, причём он должен представлять bounding box для области символа
    Если это не так, то масштабируем (обеспечив наличие ровно двух цветов в результате)
  3. В памяти эталонную картинку храним в виде двумерного массива boolean'ов
Обработка картинки:
  1. Берёшь картинку (цветную), из неё (любым доступным способом) получаешь из неё массив цветов пикселей (двумерный).
  2. Находишь связные белые области
  3. Для каждой такой области выделяешь её в отдельную картинку, смасштабированную до эталонного размера
  4. Сравниваем получившийся массив с каждым из эталонных (проверкой, что (ЦветПикселя(X,Y) = Белый) = Шаблон(I)(X,Y)), определяем число несоответствий
  5. Выбираем тот символ, для которого число несоответствий минимально
Мне не очень нравится, что контуры тонкие (1px), но, думаю, это должно работать, поскольку шумов нет.
Если выложишь охапку картинок (цветных) для тестирования, могу проверить работоспособность алгоритма на конкретных примерах.

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Чужое окно монохромно в Picturebox (BitBlt) - странности

Сообщение The trick » 13.02.2015 (Пт) 21:28

giaber писал(а):А вот такая просьба - можете объяснить, как происходит "монохромизация"

Все пиксели совпадающие с цветом фона становятся белыми, иначе черными.
UA6527P

giaber
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 14.01.2009 (Ср) 13:51

Re: Чужое окно монохромно в Picturebox (BitBlt) - странности

Сообщение giaber » 14.02.2015 (Сб) 22:14

Это XOR-ом делается ? То есть у меня есть картинка с белыми пикселями и цветными и то есть если я BitBlt сделаю на белый фон со SRCINVERT (Combines pixels of the destination and source bitmap using the Boolean XOR operator) то получу ЧБ картинку? Вроде должно просто инвертироваться? Очень плохо представляю эти процессы. То есть вопрос по сути у меня такой - какие BitBlt надо провести чтоб получить из цветного чистое ЧБ - чтобы любая цветная точка стала чёрной или белой, а любая белая соответственно противоположной. Изначально комбинация на картинке такая:цвет и белые точки, результат:
1. Белые ---> белые, цветные ---> чёрные
2. Белые ---> чёрные, цветные ---> белые
оба варианта меня устраивают, пусть даже надо несколько раз BitBlt сделать

Пробовал практически всё, что нашёл в интернете - ничего не вышло - чёрная картинка и всё! Без переборов каждого пиксела так и не смог сделать. Пока получается нормально более-менее перегнать пикчу в массив (GetBitmapBits) и там уже изменять байты, но очень громоздко... Вот меня интересует - ведь когда переводят в ЧБ (у кого-то же получается) ведь там, в недрах системы не переборами это происходит, а логическими операциями наверное? То есть можно аналог сделать при помощи BitBlt ?

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 14.02.2015 (Сб) 23:29

giaber писал(а):Без переборов каждого пиксела так и не смог сделать.

Да что плохого в переборе пикселей-то?
Я вот не вижу причин, почему надо химичить что-то ещё.

Qwertiy писал(а):Мне не очень нравится, что контуры тонкие (1px), но, думаю, это должно работать, поскольку шумов нет.

Хм.. Это я на чёрно-белый вариант посмотрел. В оригинальном контур шире, так что должно работать.
giaber, примеры картинок будут?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Чужое окно монохромно в Picturebox (BitBlt) - странности

Сообщение Mikle » 15.02.2015 (Вс) 9:42

Qwertiy писал(а):Да что плохого в переборе пикселей-то?

Согласен. Это выполнится практически мгновенно даже для 1920*1080.
Я на разноцветной картинке напечатал в разных местах надписи абсолютно белым (RGB(255,255,255)), видно, что в результате сглаживания наиболее тонкие места стали темнее, то есть фильтр должен иметь некий допуск. Я сделал пробный пример на SR2D с таким допуском:
Вложения
ColorFilter.zip
(442.74 Кб) Скачиваний: 149

giaber
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 14.01.2009 (Ср) 13:51

Re: Чужое окно монохромно в Picturebox (BitBlt) - странности

Сообщение giaber » 15.02.2015 (Вс) 18:16

Извините за долгое отсутствие! Срочные дела...

Qwertiy
Завтра выложу картинки

Mikle
Спасибо за пример, но к сожалению для меня там слишком наворочено - не разобрался, во всяком случае на скорую руку.
А нельзя ли как-то это упростить, мне-то надо очень просто: цветное - в любой один цвет(лучше, конечно, чёрный), белое - или 100% белое или100% чёрное, у вас там затенения получаются - мне это к сожалению не подходит.

А насчёт перебора - ну люблю я как можно больше спихивать на виндоус, ламер я - чё, мне не зазорно :D И вообщ у нас у ламеров. мозги через .... работают - это всм известно! :D
Не прощё разве сделать 2-3 BitBlt ? Да и хотелось бы хоть поверхностно понимать как это происходит.
Вот мнея например очень интересует, как такое реализовать, сильно упростит мою задачу:
Затем, если они совпадают, накладываем А на другое с помощью BitBlt(.NET - DrawImageUnstretched) с битовой операцией такой, чтобы получалась разница (хоть какая-то, не помню там уже что именно, помню, что есть что-то такое :) ). Так вот, таким образом, получаем изображение, на котором отмечены только несовпадающие пиксели. То есть, если такой-то пиксель васи А равен соответствующему пикселю васи Б, то выбранная нами (не случайно) битовая операция сделает что-нибудь, обращающее цвет этого пикселя в константу. Дальше делаем SetStretchBltMode (.NET - Smoothing = Smoothing.HighQuality, или как там), и StretchBlt (.NET - DrawImage) на битмап с новыми значениями ширины 1 и высоты 1, то есть ужимаем нашего васю в один пиксель. Далее смотрим: если, допустим, наша битовая операция делал все одинаковые пиксели черными (как наложение "разница" в фотошопе), а неодинаковые - нечерными (какими-нибудь), то степень отличия картинок изменяется отличием цвета новоиспеченного пикселя от черного цвета. Понятно, что способ не очень точен (на изображениях от 16x16 пикселей :) ), но зато, я полагаю, работает на порядки быстрее двух циклов. Остается только уточнить, есть ли хороший, годный битовый фильтр наложения для этой расты .

кто-то ответил: "Эта битовая операция называется XOR. В остальном - подходит как наглядное пособие по удалению гланд через ж...."


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

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Чужое окно монохромно в Picturebox (BitBlt) - странности

Сообщение Mikle » 15.02.2015 (Вс) 18:51

giaber писал(а):как такое реализовать, сильно упростит мою задачу:

Я своим примером как раз показал, что такое не прокатит, нужен допуск.
giaber писал(а):там слишком наворочено - не разобрался

А там всё не нужно смотреть - это движок. Смотри только код формы. Всё делают эти три строчки:
Код: Выделить всё
    Spr2.ClearBuffer ARGB(0, 255, 255, 255)
    Spr3.DrawDPBM Spr1, 0, 0, 1, 1, 1, 0.5 'последний параметр определяет величину допуска
    Spr2.MaskClearBuffer Spr3, 0, 0, ARGB(0, 0, 0, 0), ARGB(0, 128, 128, 128)

giaber писал(а): у вас там затенения получаются - мне это к сожалению не подходит.

На результате только чёрный и белый.

giaber
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 14.01.2009 (Ср) 13:51

Re: Чужое окно монохромно в Picturebox (BitBlt) - странности

Сообщение giaber » 15.02.2015 (Вс) 19:14

То есть когда создают маску таким способом:
' Create a monochrome DC & Bitmap of the same size as the source picture:
lhDC = CreateCompatibleDC(0)
If (lhDC <> 0) Then
lhBmp = CreateCompatibleBitmap(lhDC, Picture1.ScaleWidth \ Screen.TwipsPerPixelX, Picture1.ScaleHeight \ Screen.TwipsPerPixelY)
If (lhBmp <> 0) Then
lhBmpOld = SelectObject(lhDC, lhBmp)

' Set the back 'colour' of the monochrome DC to the colour we wish to be transparent:
SetBkColor lhDC, lTransparentColor

' Copy from the from picture to the monochrome DC to create the mask:
BitBlt lhDC, 0, 0, Picture1.ScaleWidth \ Screen.TwipsPerPixelX, Picture1.ScaleHeight \ Screen.TwipsPerPixelY, Picture1.hDC, 0, 0, SRCCOPY

там, в глубинах океана, то есть извините, виндоуса есть такая прога, типа как вы написали, и она вот таким сложным способом создаёт маску? Как-то с трудом верится, при всём моём к вам уважении! :)

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Чужое окно монохромно в Picturebox (BitBlt) - странности

Сообщение The trick » 15.02.2015 (Вс) 20:02

giaber писал(а):А нельзя ли как-то это упростить, мне-то надо очень просто: цветное - в любой один цвет(лучше, конечно, чёрный), белое - или 100% белое или100% чёрное, у вас там затенения получаются - мне это к сожалению не подходит.

The trick писал(а):Все пиксели совпадающие с цветом фона становятся белыми, иначе черными.

Что не понятно? Учти что альфа учитывается, поэтому нужно сначала "занулить" ее. Можно либо создать временный DIB на 24bpp, либо с помощью растровых операций избавится от альфы.
Безымянный.png
Безымянный.png (59.9 Кб) Просмотров: 6149


Код: Выделить всё
Option Explicit

Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function SetROP2 Lib "gdi32" (ByVal hdc As Long, ByVal nDrawMode As Long) As Long
Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Declare Function Rectangle Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function GetStockObject Lib "gdi32" (ByVal nIndex As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function SaveDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function RestoreDC Lib "gdi32" (ByVal hdc As Long, ByVal nSavedDC As Long) As Long
Private Declare Function SetBkColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long

Private Const WHITE_BRUSH As Long = 0
Private Const R2_MASKPEN As Long = 9

Private Sub Form_Load()

End Sub

Private Sub tmrTimer_Timer()
    Dim deskDC  As Long
    Dim bufDC   As Long
    Dim bufDC2  As Long
    Dim colBmp  As Long
    Dim monBmp  As Long
   
    deskDC = GetDC(0)
    bufDC = CreateCompatibleDC(deskDC)
    bufDC2 = CreateCompatibleDC(deskDC)
    colBmp = CreateCompatibleBitmap(deskDC, ScaleWidth, ScaleHeight)
    monBmp = CreateCompatibleBitmap(bufDC, ScaleWidth, ScaleHeight)
   
    SaveDC bufDC:   SaveDC bufDC2
    SelectObject bufDC, colBmp: SelectObject bufDC2, monBmp
    SelectObject bufDC, GetStockObject(WHITE_BRUSH)

    BitBlt bufDC, 0, 0, ScaleWidth, ScaleHeight, deskDC, 0, 0, vbSrcCopy
    SetROP2 bufDC, R2_MASKPEN
    Rectangle bufDC, 0, 0, ScaleWidth, ScaleHeight
   
    ' Цвет, который будет 1
    SetBkColor bufDC, &HF7F3EC
   
    BitBlt bufDC2, 0, 0, ScaleWidth, ScaleHeight, bufDC, 0, 0, vbSrcCopy
    BitBlt Me.hdc, 0, 0, ScaleWidth, ScaleHeight, bufDC2, 0, 0, vbSrcCopy
   
    ReleaseDC 0, deskDC
    RestoreDC bufDC, -1:    RestoreDC bufDC2, -1
    DeleteDC bufDC:         DeleteDC bufDC2
    DeleteObject monBmp:    DeleteObject colBmp
   
    Me.Refresh
   
End Sub

UA6527P

giaber
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 14.01.2009 (Ср) 13:51

Re: Чужое окно монохромно в Picturebox (BitBlt) - странности

Сообщение giaber » 19.03.2015 (Чт) 17:43

Всем БОЛЬШОЕ спасибо за помощь!!!


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17

    TopList