Страница: 1 |
Страница: 1 |
Вопрос: обесцвечивание картинки
Добавлено: 19.09.04 15:28
Автор вопроса: Lister | ICQ: 298621256
Народ, очень сильно нужен код для быстрой конвертации цветной картинки в оттенки серого. На сайте есть пример, но он ужасно тормозной.
А цель у меня такая: автоматом создавать из цветной "серую" картинку для тулбаровского DISABLEDIMAGELIST'а
А этот код ленту из 13 картинок конвертирует минуты 1,5-2 что для любого проекта неприемлемо
Ответы
Всего ответов: 10
Номер ответа: 1
Автор ответа:
Lister
ICQ: 298621256
Вопросов: 57
Ответов: 304
Профиль | | #1
Добавлено: 19.09.04 15:35
Кстати, то что я хочу предпринять, реализовано в последних версиях TheBat!
Номер ответа: 2
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #2
Добавлено: 19.09.04 16:57
GDI+ и ещё раз GDI+ !!!
Номер ответа: 3
Автор ответа:
Lister
ICQ: 298621256
Вопросов: 57
Ответов: 304
Профиль | | #3
Добавлено: 19.09.04 17:24
а примерчика нет?
Номер ответа: 4
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #4
Добавлено: 19.09.04 17:37
Готового на все сто - нет. Увы...
Сам бы стал делать так:
1. Идём на xtremevbtalk.com, в форум, ищем "Find all posts by user OnErr0r" в разделе, связанном с графикой.
2. В первой-второй десятке находим сообщение этого юзера с его аттачем "GdiPlus3.zip".
3. Качаем с сайта MS библиотеку gdiplus.dll, кладём её в папку проекта.
4. В проекте есть понижение цветности с 24-bit до 8-bit. Если поковыряться с GDI+ (MSDN), то можно найти, как вместе с понижением цветности в коде проекта перейти на серую палитру.
Но это всё теория, сам понимаешь )
Номер ответа: 5
Автор ответа:
Black Dragon
ICQ: 321186096
Вопросов: 30
Ответов: 347
Web-сайт:
Профиль | | #5
Добавлено: 19.09.04 19:37
А зачем тебе делать серую картинку для Тулбара в Runtime??? А почему бы тебе не сделать спокойно, ни куда не торопясь, серые картинки, и, потом, вставить их в DisabledImageList?
Номер ответа: 6
Автор ответа:
Lister
ICQ: 298621256
Вопросов: 57
Ответов: 304
Профиль | | #6
Добавлено: 19.09.04 19:41
А я хочу сделать сменные картинки - так как в TheBat
Номер ответа: 7
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #7
Добавлено: 19.09.04 23:09
1. DrawState можно нарисовать картинку с т.н. эффектом emboss...
2. С пом. LoadImage можно загрузить картинку из ресурсов чернобелой...
Номер ответа: 8
Автор ответа:
Lister
ICQ: 298621256
Вопросов: 57
Ответов: 304
Профиль | | #8
Добавлено: 20.09.04 02:47
А наврал я насчет скорости конвертирования картинки в примере, приведенном на
сайте
Там идет преобразование цвета в каждом пикселе рисунка, а
я забыл поставить ScaleMode = vbPixel...
Номер ответа: 9
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #9
Добавлено: 20.09.04 05:58
BitBlt может обесцветить. Попробуй операцию
BLACKNESS = &H00000042
Номер ответа: 10
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #10
Добавлено: 21.09.04 08:59
Это модуль ColorToGray переделанный и оптимизорованный мной (взято с сырцов,
кажется )
'Дата модификации 07.04.2004
Option Explicit
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Declare Function GetWindowRect Lib "user32.dll" (ByVal hWnd As Long,
lpRect As RECT) As Long
Private Declare Function SetPixel Lib "gdi32.dll" (ByVal hdc As Long, ByVal
x As Long, ByVal y As Long, ByVal crColor As Long) As Long
Private Declare Function GetPixel Lib "gdi32.dll" (ByVal hdc As Long, ByVal
x As Long, ByVal y As Long) As Long
Private Declare Function GetDC Lib "user32.dll" (ByVal hWnd As Long) As Long
Public Sub ColorToGray(hWnd As Long)
Dim bytR As Byte
Dim bytG As Byte
Dim bytB As Byte
Dim lngX As Long
Dim lngY As Long
Dim rctRect As RECT
Dim lngColor As Long
Dim Gray As Long
Dim lngDC As Long
GetWindowRect hWnd, rctRect
lngDC = GetDC(hWnd)
For lngX = 0 To rctRect.Right - rctRect.Left - 4
For lngY = 0 To rctRect.Bottom - rctRect.Top - 4
lngColor = GetPixel(lngDC, lngX, lngY)
bytR = lngColor And &HFF
bytG = (lngColor \ 256) And &HFF
bytB = (lngColor \ 65536) And &HFF
Gray = bytR * 0.3 + bytG * 0.59 + bytB * 0.11
lngColor = RGB(Gray, Gray, Gray)
SetPixel lngDC, lngX, lngY, lngColor
Next lngY
Next lngX
End Sub