Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SetDIBits не срабатывает 
V
    Опции темы
deniska
Дата 31.8.2006, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: нет
Всего: 0



Функции SetDIBits, SetBitmapBits, SetDIBitsToDevice
не срабатывают при увеличении размера рисунка. Может сработат, а может и нет, причем вернет 0 и она и GetLastError. Почему такая нестабильность? Кто-нибудь с таким сталкивался?
PM MAIL ICQ   Вверх
Earnest
Дата 31.8.2006, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Что значит - не срабатывает?


--------------------
...
PM   Вверх
deniska
Дата 31.8.2006, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: нет
Всего: 0



Это значит что возвращает 0
PM MAIL ICQ   Вверх
GremlinProg
Дата 31.8.2006, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



да, бывало такое, что SetDIBitsToDevice иногда не заполняло девайс. Выбрал альтернативу - рендеринг IPicture.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
deniska
Дата 31.8.2006, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: нет
Всего: 0



не пойдеть smile  мне нужно максимально быстро заполнять dc. Да и потом СОМ этот.....
PM MAIL ICQ   Вверх
GremlinProg
Дата 31.8.2006, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



так что лучше, скорость или надежность? На некоторых виндовозах SetDIBitsToDevice вообще отказывался работать, возможно тут аппаратная зависимость: мне приходилось рендерить на довольно ёмкие девайсы


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
deniska
Дата 31.8.2006, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: нет
Всего: 0



Нет, ну должно же быть какое-то нормальное объяснение почему несрабатывает.
Честно говоря первый раз столкнулся с фигней. Всегда думал что на АПИ писать надежнее smile

Добавлено @ 13:08 
В конце концов IPicture в итоге теми же ф-циями пользуется. Наверно.....
PM MAIL ICQ   Вверх
GremlinProg
Дата 31.8.2006, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



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


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Earnest
Дата 31.8.2006, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



А вместо них нельзя использовать BitBlt со товарищи? Никогда не встречалась с их "не-срабатываниями". Да, несколько другие исходные данные: 2 контекста, а не растр + контекст, но это вообще не проблема.
В чем специфика задачи, что нужно именно SetDIBits? Блиттинг работает не медленнее... Кстати, функции IPicture. скорее всего, как раз на блиттингах реализованы.



--------------------
...
PM   Вверх
GremlinProg
Дата 31.8.2006, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Earnest, а доступ к растру прикажешь GetPixel'ом организовывать? )) Очевидно же, что необходим прямой доступ.

Добавлено @ 18:33 
IPicture организует диб-образ в вирт. памяти(это можно проверить GetObject'ом), следовательно дамп образа мэпируется в граф. девайс напрямую, а SetDIBits, по крайней мере, это делает. Вывод: IPicture скорее всего опирается на SetDIBits и ей подобные.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Earnest
Дата 1.9.2006, 06:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



А кто против? Заведи DIB-секцию, и будет и прямой доступ, и возможность выбора в контекст.
DIB-растр в DIB-секцию элементарно превращается.

Добавлено @ 06:52 
Кстати, работа с контекстами (и DIB-секцией) хороша еще тем, что автоматически получаешь возможность растризовать любые векторные примитивы - GDI рисует...


--------------------
...
PM   Вверх
GremlinProg
Дата 1.9.2006, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Earnest, а в чем, собственно, проблема? Я вроде как о DIB-секции и говорю. В этом и преимущество IPicture. Только секция создается сразу, без лишних вопросов. Это экономит кучу времени.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Earnest
Дата 1.9.2006, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



IPicture, как бы оно не реализовывалась, это обертка вокруг API, т.е. есть какие-никакие лишние издержки. Я не знаю, почему автор не хочет IPicture. Может, GDI+ не хочет подключать. Поэтому и предлагаю АПИшную альтернативу функциям SetDIBits и пр., которая всегда работает - я, по крайней мере, не сталкивалась с косяками блиттинга. Хотя не исключено, что у него просто косяки в коде. 


--------------------
...
PM   Вверх
GremlinProg
Дата 1.9.2006, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



GDI+ тут совершенно ни при чем (может путаешь с оберткой CPicture). Ему просто не хочется связываться с OLE, как он уже успел заметить (хотя, на мой взгляд, это не должно быть так обременительно, как например тот же GDI+, которому нужна таки библиотека. OLE поддерживается везде и уже давно)

Добавлено @ 10:03 
Альтернатива, конечно, всегда есть. Можно использовать и CreateDIBSection, но, если необходимо загрузить в эту секцию растр из файла любого из зарегистрированных в системе граф. типов (jpeg, bmp, tif...), то я все же порекомендовал бы IPicture.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Earnest
Дата 1.9.2006, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Да, пожалуй, спутала...
Не... OLE никому не порекомендую - уж там-то издержки...
Лучше тогда CImage использовать (GDI+ ИМХО, лучше чем OLE). А класс простой. 




--------------------
...
PM   Вверх
deniska
Дата 1.9.2006, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: нет
Всего: 0



Цитата

Хотя не исключено, что у него просто косяки в коде smile 

 smile 
Может, может. Сейчас вот сижу капаюсь.
BitBlt я пробовал. С него собственно и начал.
Функции возвращают 0 при увеличении картинки где-то с 500*500
У меня в окне есть область которая заполняется фоном с градиентом. Эту область я мышой могу ресайзить. Пока размер области небольшой, все вроде работает
PM MAIL ICQ   Вверх
GremlinProg
Дата 1.9.2006, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(Earnest @  1.9.2006,  12:52 Найти цитируемый пост)
OLE никому не порекомендую - уж там-то издержки...

Конечно, не все OLE-компоненты универсальны и удобны, но не нужно судить так обо всех интерфейсах , я тоже сталкивался с некоторыми излишествами в OLE, но мы сейчас говорим конкретно об одном:
Цитата(MSDN)

IPicture Methods:
get_Handle Returns the Windows GDI handle of the picture managed within this picture object. 
get_hPal Returns a copy of the palette currently used by the picture object. 
get_Type Returns the current type of the picture. 
get_Width Returns the current width of the picture in the picture object. 
get_Height Returns the current height of the picture in the picture object. 
Render Draws the specified portion of the picture onto the specified device context, positioned at the specified location. 
set_hPal Sets the current palette of the picture. 
get_CurDC Returns the current device context into which this picture is selected. 
SelectPicture Selects a bitmap picture into a given device context, returning the device context in which the picture was previously selected as well as the picture's GDI handle. 
get_KeepOriginalFormat Returns the current value of the picture object's KeepOriginalFormat property. 
put_KeepOriginalFormat Sets the picture object's KeepOriginalFormat property. 
PictureChanged Notifies the picture object that its picture resource changed. 
SaveAsFile Saves the picture's data into a stream in the same format that it would save itself into a file. 
get_Attributes Returns the current set of the picture's bit attributes. 

Здесь get_Handle возвращает HBITMAP, с которым можно работать как обычно, а метод Render делает очень полезную вещь: рендерит в указанный девайс любой кусок HBITMAP, с нужным масштабом, причем метод рендеринга выбирается тот, который поддерживается системой: если это битмап, то происходит нечто похожее на StretchDIBits, если упакованный жипех, то его собственный рендеринг. Т.е. Render избавляет нас от лишней мороки, да и о качестве говорить не приходится. Остальные методы, роли не играют, они просто дублируют соответствующие вызовы API, так что нагрузки особой на ресурсы не несут.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Earnest
Дата 1.9.2006, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Цитата(deniska @  1.9.2006,  12:01 Найти цитируемый пост)
BitBlt я пробовал. С него собственно и начал.
Функции возвращают 0 при увеличении картинки где-то с 500*500

Так может у тебя с преобразованием координат какая-то ерунда?
Там же есть ограничения... Или еще что-то в этом роде...

Покажи кусок кода.

Добавлено @ 12:12 
Я думаю, что в этом случае ни IPicture, ни CImage тебя не спасут... нужно разобраться с координатами


--------------------
...
PM   Вверх
deniska
Дата 1.9.2006, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: нет
Всего: 0



Цитата

Так может у тебя с преобразованием координат какая-то ерунда?

Я думаю не должно так как при небольших то размерах работает нормально а координаты считаются одинаково для любого размера.
Мне этими функциями приходилось пользоваться так как градиент я ручками делал (массив заполнял).
потом этот массив надо было в dc записывать.
Сейчас попробовал FillGradient. Сижу и наслаждаюсь: в 3 раза быстрее, никаких глюков с прорисовкой,
про память под массив париться не нужно. В общем пока одни достоинства.
Спасибо Earnest и GremlinProg что пытались помочь
P.S. Все равно странно почему же глюковало? Надо руки выпрямлять наверно....
PM MAIL ICQ   Вверх
Earnest
Дата 1.9.2006, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Цитата(deniska @  1.9.2006,  13:51 Найти цитируемый пост)
Я думаю не должно так как при небольших то размерах работает нормально а координаты считаются одинаково для любого размера

Существуют ограничения



--------------------
...
PM   Вверх
GremlinProg
Дата 1.9.2006, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(Earnest @  1.9.2006,  14:10 Найти цитируемый пост)
Я думаю, что в этом случае ни IPicture, ни CImage тебя не спасут

однако же IPicture как раз и спасло, я уже говорил )
Цитата(deniska @  1.9.2006,  14:51 Найти цитируемый пост)
так как градиент я ручками делал (массив заполнял).

Лучше всего сразу о таких вещах сообщать, т.е. говорить не так, мол не работает функция, а сразу пояснять задачу и цели, тогда тебя будет проще понять. Действительно, специализированные функции, такие как AlphaBlend, BitBlt, StretchBlt, FillGradient и т.п. как правило работают намного быстрее, нежели их пытаться реализовать, пусть даже через прямой доступ. Прямой доступ к растру лучше использовать только когда необходимо применить к нему какой-то собственный алгоритм, который не имеет аналогов в API, либо когда нужен попиксельный анализ растра.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1008 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.