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

нарисовать битмап устанавливая цвет каждого пикселя. direct2d

18.05.2021, 00:53. Показов 4265. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня есть массив с данными , которые должны использоваться для того чтобы задавать цвет, как это сделать в direct2d ,
вопрос кажется легким , но ответа я на него не нашел , аналог SetPixel() можно сказать. Если процесс сложный оставьте пожалуйста комментарии.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.05.2021, 00:53
Ответы с готовыми решениями:

Вывести в окно битмап, используя инструменты Direct2D
Всем привет! Вообще, вопрос связан с классами и объектами из Direct2D, но проблемы у меня чисто СиПлюсПлюсные, поэтому пишу в этот раздел. ...

как получить цвет каждого пикселя
У меня есть картинка в PictureBox'e как можно заполучить цвет каждого пикселя что бы потом можно было снова собрать картинку?

Получить цвет каждого пикселя изображения, разбив на уровни RGB
Нужно получить цвет каждого пикселя изображения, разбив на уровни RGB. Как реализовать подобное?

8
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,118
18.05.2021, 12:49
Аналогов функции SetPixel нет, но возможность попиксельного рисования есть. Подобное рисование будет крайне медленным и не эффективным. Одно дело, если вам нужно сделать это единожды, и совсем другое, если вы хотите попиксильно рисовать сцену несколько раз в секунду.
1
3 / 3 / 1
Регистрация: 19.05.2019
Сообщений: 180
18.05.2021, 12:54  [ТС]
мда, паходу преподу придется объяснить что direct использовать вредно.
Мне нужен именно второй вариант.
0
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,118
18.05.2021, 13:20
Объекты direct2d как правило "лежат" в памяти графической карты. Различные операции с объектами так же выполняются в памяти графической карты. Всё это сделано для того, что бы повысить скорость рисования. Максимальная производительность достигается путём загрузки в память графической карты всего материала необходимого для сцены и дальнейшего комбинирования сцены из имеющихся объектов. Вам нужно как-то попытаться соотнести свою задачу с этими принципами.

Если пикселей не очень много, то вы можете создать набор разноцветных кистей и закрашивать ими квадратики (пиксели).

Если же прям нужен битмэп, то нужно выделять блок данных в операционной памяти компа. Рисовать свои пиксели в этом блоке памяти. Затем копировать этот блок в объект ID2D1Bitmap (CopyFromMemory). Затем средствами direct2d рисовать получившийся битмэп (ID2D1RenderTarget:: DrawBitmap). Всё же я полагаю, что это будет не очень быстрый способ.
0
3 / 3 / 1
Регистрация: 19.05.2019
Сообщений: 180
18.05.2021, 13:42  [ТС]
а можешь пример скинуть? как рисовать свои пиксели в блоке памяти, ты в этом пункте зацепок не оставил.
0
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,118
18.05.2021, 14:24
Во-первых, нужно знать формат Bitmap-а, который используется в direct2d.
Сейчас я точно не помню, но вроде там был BGRA по 8 бит на каждую компоненту.
Это значит, что один пиксель кодируется 4-мя байтами.
Для картинки 4 на 4 пикселя картинка будет выглядеть как-то так:
 0123
аrgbargbargbargba
бrgbargbargbargba
вrgbargbargbargba
гrgbargbargbargba

При разворачивании пикселей в строку (непрерывный блок памяти) получается последовательность строк:
а0а1а2а3б0б1б2б3в0в1в2в3г0г1г2г3

Каждая ячейка (пиксель) занимает 4 байта.
Если вам нужно изменить первый пиксель во второй строке сверху (б0), то нужно посчитать его смещение от начала. Для этого нужно номер строки умножить на длину строки в байтах и прибавить номер столбца помноженный на 4.
ofset = row*pinch + col*4 = 1*16 + 0*4 = 16
Первый байт нужного пикселя (б0) имеет смещение 16. Этот байт определяет синюю компоненту пикселя, следующий байт - зеленую, следующий - красную, следующий - прозрачность. Если хотите, то можете написать свою функцию SetPixel для работы с блоком памяти. Или можете заполнять картинку последовательно начиная с начала и постоянно инкриментируя адрес ячейки.
0
3 / 3 / 1
Регистрация: 19.05.2019
Сообщений: 180
18.05.2021, 16:42  [ТС]
я такой делаю стринг , или массив стрингов которые будут такие "FFAABBEE" и это будет мой блок памяти?
посчитать смещение я понял как, вроде не сложно, как обратиться к самому пикселю, как мне ему присвоить значение?
какой командой?
пикселю битмапа.

Добавлено через 18 минут
в майкрософт такой параметр для CopyFromMemory , я не понимаю в каком виде? одномерный массив , двумерный
массив чего? байтов , стрингов, чаров , интов.
const void *srcData,
0
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,118
18.05.2021, 16:44
Лучший ответ Сообщение было отмечено ДЛ имончик как решение

Решение

массив чего?
bm.memory

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
struct MyBitmap
{
    int width;
    int height;
    unsigned char* memory;
 
    MyBitmap(int w, int h)
    {
        width = w;
        height = h;
        memory = new unsigned char[w * h * 4];
    }
 
    ~MyBitmap()
    {
        delete[] memory;
    }
 
    void SetPixel(int x, int y, unsigned char r, unsigned char g, unsigned char b, unsigned char a = 0)
    {
        if (x >= 0 && x < width)
        {
            if (y >= 0 && y < height)
            {
                int ofs = (y * width + x) * 4;
 
                memory[ofs + 0] = b;
                memory[ofs + 1] = g;
                memory[ofs + 2] = r;
                memory[ofs + 3] = a;
            }
        }
    }
};
 
int main()
{
    MyBitmap bm(100, 100);
 
    for (int y = 0; y < 100; y++)
    {
        for (int x = 0; x < 100; x++)
        {
            bm.SetPixel(x, y, x * 255 / 99, 128, 128);
        }
    }
 
    return 0;
}
1
3 / 3 / 1
Регистрация: 19.05.2019
Сообщений: 180
18.05.2021, 16:48  [ТС]
спасибо!!! понял что написать мне быстрее чем объяснить))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.05.2021, 16:48
Помогаю со студенческими работами здесь

Можно ли менять цвет не каждого пикселя, а глобально для всей картинки?
Хочу сделать в визуальном интерфейсе приблуду, скролы позволяющие менять цвет интерфейса по RGB. С обычными компонентами проблеммы нет, но...

Изменить цвет формы в цвет пикселя под курсором по клику мыши
Есть код. Но форма выкрашивается только в серый цвет и такой и остается, несмотря на изменение цвета пикселя под курсором. Подскажите куда...

Написать программу, которая будет определять цвет пикселя под курсором и выводить на экран этот цвет
Хочу написать программу, кот. будет определять цвет пикселя под курсором и выводить на экран этот цвет словом или кодом или как лучше?...

Цвет пикселя
Помогите!!! Мне нужно получить цвет определенного пикселя... нашел только как задать пиксель putpixel :( Мне нужно знать: через 10...

цвет пикселя
Здравствуйте. Я на pictureBox рисую квадраты разного цвета. Как определить цвет под курсором. Спасибо.


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
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