Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
5 / 5 / 1
Регистрация: 06.02.2010
Сообщений: 33

Тормозит Bitmap

14.02.2010, 16:15. Показов 1823. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
1) при создание нового экземпляра класса bitmap используется не тот конструктор, тоесть: Я пише:
Code
1
Bitmap bmp(membit,(HPALETTE *)NULL);//Где membit - HBITMAP
А при компиляции выдается ошибка:
Gdiplus::Bitmap::Bitmap(const WCHAR *,BOOL): невозможно преобразовать параметр 1 из 'HBITMAP' в 'const WCHAR *'
Почему такой бред получается, ведь я вызываю совсем другой конструктор?
2) Открываю Bitmap из файла вот так:
Code
1
Bitmap bmp1(L"D://Screen//Скрин2.bmp");
Потом сохраняю вот так:
Code
1
bmp1.Save(L"D://Screen//some.bmp",&((CLSID)::ImageFormatBMP));
Затем пытаюсь вывести цвет пикселей вот так:
Code
1
2
zvet = bmp1.GetPixel(x,y,&zvet);
std::cout << x << "|" << y << "|" << zvet.Red << "|" << zvet.Green << "|" << zvet.Blue << "\n";
И как это часто бывает, ничего не выходит.

Добавлено через 50 минут
Первую ошибку исправил, делается так:
Code
1
Bitmap bmp(membit,(HPALETTE)NULL);
Но я по прежнему не могу получить цвет пикселя.

Добавлено через 45 минут
Сейчас делаю так:
Code
1
2
Bitmap* bmp1=new Bitmap(1680,1050);
bmp1=Bitmap::FromHBITMAP(membit,(HPALETTE)0);
Но как только обращаюсь к какому-нибудь методу bmp1, сразу выдается ошибка при выполнение: типа память по адресу Х не смогла обратиться к памяти по адресу Y. Память не может быть read.
Тоесть код:
Code
1
cout << bmp1->GetHeight() << "|"<< bmp1->GetWidth() <<"\n";
Генерирует такое сообщение при выполнение.

Добавлено через 1 час 28 минут
проблема в том, что Bitmap::FromHBITMAP(membit,(HPALETTE)0); возвращает ноль
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.02.2010, 16:15
Ответы с готовыми решениями:

BITMAP
Каким образом можно работать с BITMAP с помощью WinAPI????? Т.е. мне нужно создать 2d массив из цветов пикселей BITMAP-а После кода:...

создание Clone с Bitmap меньшего размера с сохранением изначальных габаритов Bitmap
Взялся за GDI, столкнулся с проблемой. Есть &quot;бегущая строка&quot;, она движется справа налево. Если перерисовывать по пикселям...

Как создать bitmap из области (по координатам пикселей) другого bitmap
Здравствуйте. Подскажите пожалуйста как создать bitmap из области(по координатам пикселей) другого bitmap. Вообщем обрезать.

13
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
14.02.2010, 16:59
Цитата Сообщение от Axenic Посмотреть сообщение
bmp1=Bitmap::FromHBITMAP(membit,(HPALETT E)0);
Вот ЭТО работать точно не будет.
Хотя бы просто потому, что GDI+ требует рабочих хэндлов битмэпа и палитры, а у тебя хэндл палитры "виртуальный": (HPALETTE)0.
Кроме того, GDI+, если верить документации, требует, чтобы использовались хэндлы "текущих" битмэпа и палитры, т.е. их надо сначала выбрать в контекст устройства.

Итого процедура:
создаешь битмэп, создаешь палитру, выбираешь их в контекст устройства, и только тогда делаешь FromHBITMAP().

И еще дополнение, пока ты не удалил то, что у тебя получилось, после
bmp1=Bitmap::FromHBITMAP(...);
удалять объекты битмэп(то, к чему привязан membit) и палитру тоже нельзя.
Иначе GDI+ навернется.
0
5 / 5 / 1
Регистрация: 06.02.2010
Сообщений: 33
14.02.2010, 17:02  [ТС]
с membit все нормально. Он определен.
А вот как с палитрой быть? В докусентации копался не получилось создать экземпляр класса CPalette. Если не сложно скажи как его сделать.
Да и ещё, почему "new Bitmap(L"D://Screen//sc.bmp")" тоже возвращает ноль? Ведь это открытие файла, почему же он ноль возвращет?
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
14.02.2010, 17:47
Извини за идиотский вопрос, но ты документацию читаешь, или изучаешь все методом научного тыка?
Конструктор Bitmap(const WCHAR *filename, BOOL useIcm) переменной НЕ ВОЗВРАЩАЕТ.
С палитрой... делаешь палитру, делаешь структуру LOGPALETTE, заполняешь ее, делаешь CreatePalette(...) с этой структурой. Все.
есть замечательный сайт: http://msdn.microsoft.com/ru-r... fault.aspx
там все написано; и половина - даже на русском языке.
0
5 / 5 / 1
Регистрация: 06.02.2010
Сообщений: 33
14.02.2010, 17:54  [ТС]
Когда открываю рисуно в битмап так:
Code
1
2
Bitmap bmp1(L"D://Screen//sc.bmp");
cout << bmp1.GetHeight() << "|"<< bmp1.GetWidth() <<"\n";
То по-прежнему выводиться 0|0
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
14.02.2010, 18:06
Значит, не нашел он файл.
Или формат не понял.

точно не помню, но кажется, в пути к файлу используется ЛЕВЫЙ слэш.
попробуй написать Bitmap bmp1(L"D:\\Screen\\sc.bmp");
а правый слэш вроде для обозначения локальной сети.
0
5 / 5 / 1
Регистрация: 06.02.2010
Сообщений: 33
14.02.2010, 18:13  [ТС]
Я разве не правильно, что-то записал в пути к файлу? Когда делаешь профект Windows Form, такой конструктор успешно подгружает файл. А в консольком проекте он не что-то не распознает.
Почему так получается?
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
14.02.2010, 18:18
Цитата Сообщение от Axenic Посмотреть сообщение
Когда делаешь профект Windows Form, такой конструктор успешно подгружает файл.
а у меня с правыми слэшами ничего не работает.
0
5 / 5 / 1
Регистрация: 06.02.2010
Сообщений: 33
14.02.2010, 18:42  [ТС]
А у меня со всеми возможными слешами не работает и одинарными и двойными. А с какими слещами у тебя работает работает.

Добавлено через 11 минут
А у меня со всеми возможными слешами не работает и одинарными и двойными.

Да и если не сложно код для создания палитры. А то я не могу разобраться в этом лабиринте.

Боже , зачем нужно было делать все так сложно. Сразу видно что STD не "специалисты высокого уровня" из Microsoft составляли. Там все для людей сделано.
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
15.02.2010, 07:39
Цитата Сообщение от Axenic Посмотреть сообщение
Боже , зачем нужно было делать все так сложно. Сразу видно что STD не "специалисты высокого уровня" из Microsoft составляли. Там все для людей сделано.

так не пользуйся GDI+. это-же только обертка.
мне всю жизнь и MFC хватало.
или вообще на WinAPI делай - том-то точно все работает.

Цитата Сообщение от Axenic Посмотреть сообщение
Да и если не сложно код для создания палитры. А то я не могу разобраться в этом лабиринте.
что непонятно-то?
C++
1
2
3
4
5
6
7
8
LOGPALETTE * pal = static_cast(malloc (sizeof (LOGPALETTE) + (sizeof (PALETTEENTRY) * 1))); //массив на структуру + 1 цвет
 memset (pal, 0, sizeof (LOGPALETTE) + (sizeof (PALETTEENTRY) * 256));
pal->palPalEntry[0].peRed = 0;  //делаем для примера черный цвет
pal->palPalEntry[0].peGreen = 0;
pal->palPalEntry[0].peBlue = 0;
pal->palPalEntry[0].peFlags = PC_NOCOLLAPSE;
CPalette Palette;
Palette.CreatePalette(pal);
Добавлено через 15 минут
Кстати, ты бы хоть приличную часть кода показал, а то я так и не понял, что такое membit и где оно определялось.
0
5 / 5 / 1
Регистрация: 06.02.2010
Сообщений: 33
15.02.2010, 11:48  [ТС]
У меня не обределен класс CPalette. Чтобы его оперделить нужно подключить #include <afxwin.h> но он пишет что такой файл не найден. И в платфором СДК его тоже нет. У тебя компилируется этот код?

И так каждый цвет нужно забить?
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
15.02.2010, 12:15
на чем пишешь?
<afxwin.h> подключается автоматом в нормальном НЕ КОНСОЛЬНОМ приложении.
а цвета, по идее, нужно взят из битмэпа.
собственно, ты один, похоже, такой изверг, что в GDI+ полез.
0
5 / 5 / 1
Регистрация: 06.02.2010
Сообщений: 33
15.02.2010, 12:22  [ТС]
Если писать в не консольноп риложении там и палитра не нужна. Ладно спасибо буду писать в виндовс форм.
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
15.02.2010, 12:48
Цитата Сообщение от Axenic Посмотреть сообщение
Если писать в не консольноп риложении там и палитра не нужна.

Собственно, только там она и нужна.
И Bitmap может корректно работать в НЕ КОНСОЛЬНОМ приложении.
Он-же требует Контекст Устройства(DC), который в консоли текстовый, а не графический.
Понятно, почему у тебя картинка не грузилась.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.02.2010, 12:48
Помогаю со студенческими работами здесь

Получение фото с веб камеры, занесение его в Bitmap и преобразование Bitmap в массив
В общем необходимо подключиться к веб камере сделать снимок и отправить его в сеть. Задачу я разделил на несколько этапов. 1. Сам...

Нарисовать прошлый Bitmap на новом так, чтобы небыл растянут рисунок, если новый Bitmap больше размером
Короче пытался сделать такое дело: Рисую фигуры на форме, когда отпускаю левую кнопку мыши (когда кнопка зажата, то растягивается например...

BitMap Основные функции + работа в Bitmap
Я наткнулся на пару проблем не известных для меня. 1. Как поставить &quot;Настройки компонента&quot; чтобы они работали в BitMap 2. Как...

Происходит ли "утечка памяти" при повторном выполнении: Bitmap bm1 = new Bitmap
Здравствуйте ! Подскажите, пожалуйста, происходит ли &quot;утечка памяти&quot; при создании объекта bm1 и, если не сложно - как её избежать. ...

Как нарисовать Bitmap на Bitmap?
Bitmap1-&gt;Canvas-&gt;Draw(1,1,Bitmap2); Так не работает, хотя с Image проходило.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru