Форум программистов, компьютерный форум, киберфорум
Pure Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
3 / 3 / 0
Регистрация: 14.12.2020
Сообщений: 171

Как функцией BitBlt записать данные в массив?

28.05.2023, 16:32. Показов 4064. Ответов 55
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Подскажите, пожалуйста как заставить следующий код заработать?

PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
ExamineDesktops()
Width=DesktopWidth(0)
Height=DesktopHeight(0)
x=0
y=0
Dim Image_Array(Width-1, Height-1)
ImageNumber=CreateImage(#PB_Any, Width, Height)
DC_Image=StartDrawing(ImageOutput(ImageNumber)) 
StopDrawing()
BitBlt_(Image_Array(), 0, 0, Width, Height , DC_Image, X, Y , #SRCCOPY)
 
Debug Image_Array(Width-1,Height-1)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.05.2023, 16:32
Ответы с готовыми решениями:

Как записать в массив слова с функцией strtok
Вот код, я разбил строку на слова, как теперь каждое слово записать массив, для дальнейшего использования? #include <stdio.h> ...

Вывод изображения функцией BitBlt
Ребят, подскажите пожалуйста как правильно обработать сообщение WM_PAINT, чтобы при смене вкладок окна класса WC_TABCONTROL, функция BitBlt...

Как записать в массив данные из *.TXT и и правильно рассортировать данные по ячейкам массива?
файл index.php <?php $site = (file('text.txt')); в файле text.txt находится: xxxxxx.ru xxxxx.com xxxx.org xxxx.ru...

55
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
28.06.2023, 10:13
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от nigri_lupus Посмотреть сообщение
А вот КАК может быть закодирован цвет в одном байте - ума не приложу.
Цвет кодируется в палитре (массив RGB). А тот самый байт — это индекс из этого массива.
0
3 / 3 / 0
Регистрация: 14.12.2020
Сообщений: 171
28.06.2023, 10:42  [ТС]
Замабувараев, набросал на скорую руку:
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
LoadImage(0, "D:\qqq.bmp")
w=ImageWidth(0)-1
h=ImageHeight(0)-1
StartDrawing(ImageOutput(0))
*a = DrawingBuffer()
For y = h To 0 Step -1
  For x = 0 To h
    b = PeekA(*a + n)
    g = PeekA(*a + n + 1)
    r = PeekA(*a + n + 2)
    n + 3
  Next
Next
Цитата Сообщение от Замабувараев Посмотреть сообщение
массив RGB
Это где?
*a - собственно адрес, после которого лежать байты точек(как я понимаю линейно, т.е. как бы одной длинной непрерывной строчкой) причем у меня получается на каждый пиксель по 3 байта...
n - кол-во байт относительно начального адреса

Добавлено через 7 минут
откуда я беру
Цитата Сообщение от nigri_lupus Посмотреть сообщение
b = PeekA(*a + n)
    g = PeekA(*a + n + 1)
    r = PeekA(*a + n + 2)
Я, вроде понимаю.
Но если *a это адрес по которому как бы расположена "строка пикселей", то где тогда находится массив RGB?
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
28.06.2023, 12:08
Цитата Сообщение от nigri_lupus Посмотреть сообщение
Это где?
Как это где. В палитре.
Например, в палитре определены (заданы) 16 цветов. Берёте ноль — это будет первый цвет из палитры, берёте 1 — это второй цвет из палитры. И так далее. У вас всего 16 вариантов, это влезет в 1 байт.
0
Эксперт по электронике
7000 / 3316 / 341
Регистрация: 28.10.2011
Сообщений: 13,030
Записей в блоге: 7
28.06.2023, 12:26
Цитата Сообщение от nigri_lupus Посмотреть сообщение
Сколько бы не открывал я разных картинок при помощи LoadImage, а DrawingBufferPixelFormat() всё время "#PB_PixelFormat_24Bits_BGR | #PB_PixelFormat_ReversedY" выдаёт. Я эти картинки (ради эксперимента) перед загрузкой даже сохранял паинтом как монохромные и всё равно "#PB_PixelFormat_24Bits_BGR | #PB_PixelFormat_ReversedY".
Мне интересно почему? Ведь, другие форматы не просто так придумали? Если они описаны в РВ, значит при каких-то условиях они существуют. Вопрос при каких...
Проверяли в Linux и MacOS X?

Картинка может быть 32-ух битной. Тогда будет #PB_PixelFormat_32Bits_RGB или #PB_PixelFormat_32Bits_BGR вместо #PB_PixelFormat_24Bits_BGR.
Также у gif и ico могут быть отличия.
0
3 / 3 / 0
Регистрация: 14.12.2020
Сообщений: 171
28.06.2023, 12:31  [ТС]
Замабувараев, Прошу прощения за мою тупость. Попробую спросить по-другому....
*a = DrawingBuffer() - адрес с которого начинается пиксели, каждый пиксель по x-байт.
Чтобы найти конкретный пиксель надо: взять значение из *a+х*кол-во пикселей.
А где палитру-то искать? Она(палитра) есть по адресу *a = DrawingBuffer()+(-)сколько-то?

Добавлено через 2 минуты
Цитата Сообщение от locm Посмотреть сообщение
Проверяли в Linux и MacOS X?
нет, т.к. пишу под windows.... проверял на 7 и 10...

Добавлено через 1 минуту
Цитата Сообщение от locm Посмотреть сообщение
Также у gif и ico могут быть отличия.
проверял только на BMP
0
Эксперт по электронике
7000 / 3316 / 341
Регистрация: 28.10.2011
Сообщений: 13,030
Записей в блоге: 7
28.06.2023, 12:33
Цитата Сообщение от nigri_lupus Посмотреть сообщение
А где палитру-то искать?
Она может быть в файле-картинке.
Во время загрузки картинки в память, она преобразуется в RGB.
0
3 / 3 / 0
Регистрация: 14.12.2020
Сообщений: 171
28.06.2023, 12:34  [ТС]
Мне в принципе важно, чтобы с BMP "сюрпризов" не было...
0
Эксперт по электронике
7000 / 3316 / 341
Регистрация: 28.10.2011
Сообщений: 13,030
Записей в блоге: 7
28.06.2023, 12:34
Цитата Сообщение от nigri_lupus Посмотреть сообщение
проверял только на BMP
А ведь есть еще jpg, png, tiff, tga, gif, ico и другие форматы.
0
3 / 3 / 0
Регистрация: 14.12.2020
Сообщений: 171
28.06.2023, 12:43  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
А ведь есть еще jpg, png, tiff, tga, gif, ico и другие форматы.
, т.е. если я работаю только с BMP, то DrawingBufferPixelFormat() у меня всегда будет один и тот же? я правильно понял?
0
Эксперт по электронике
7000 / 3316 / 341
Регистрация: 28.10.2011
Сообщений: 13,030
Записей в блоге: 7
28.06.2023, 12:55
Цитата Сообщение от nigri_lupus Посмотреть сообщение
если я работаю только с BMP, то DrawingBufferPixelFormat() у меня всегда будет один и тот же?
Не факт https://ru.wikipedia.org/wiki/BMP
Microsoft предлагает битности 1, 2, 4, 8, 16, 24, 32, 48 и 64.
Вероятнее всего если меньше 24 бит, то будет преобразовано в 24.
32 также поддерживается.
0
3 / 3 / 0
Регистрация: 14.12.2020
Сообщений: 171
28.06.2023, 13:12  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
Microsoft предлагает битности 1, 2, 4, 8, 16, 24, 32, 48 и 64.
я потому и спрашиваю...
Просто мне показалось странным, что я сохранил BMP (паинтом) как монохром потом загрузил её LoadImage и получив формат пикселя вновь увидел тот же формат, что и на цветном рисунке...

Добавлено через 9 минут
Цитата Сообщение от locm Посмотреть сообщение
Вероятнее всего если меньше 24 бит, то будет преобразовано в 24.
Собственно у меня тоже подобная мысль мелькнула, но чтобы убедится решил уточнить....
А то нехорошо будет, если написанное приложение вдруг глюканет, из-за того, что я неучел другие варианты DrawingBufferPixelFormat()
0
Эксперт по электронике
7000 / 3316 / 341
Регистрация: 28.10.2011
Сообщений: 13,030
Записей в блоге: 7
28.06.2023, 14:12
Цитата Сообщение от nigri_lupus Посмотреть сообщение
если написанное приложение вдруг глюканет
Нужно проверять формат. Если не тот что ожидается, не обрабатывать файл и вывести сообщение что формат не поддерживается.
0
3 / 3 / 0
Регистрация: 14.12.2020
Сообщений: 171
09.07.2023, 22:02  [ТС]
Только мне показалась, что я разобрался с DrawingBuffer(), как тут же наткнулся на еще одну загадку...
Загрузил картинку bmp размером 39х37 с глубиной цвета 24.
На всякий случай проверил её DrawingBufferPixelFormat() и DrawingBufferPitch()
DrawingBufferPixelFormat() показал 3 байта на пиксель, что логично.
А вот DrawingBufferPitch() показал реальную длину строки в байтах = 120
Но ведь 39*3=127.... возникает вопрос, откуда взялись еще ТРИ байта и что это ха байты?
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
10.07.2023, 07:26
Цитата Сообщение от nigri_lupus Посмотреть сообщение
откуда взялись еще ТРИ байта и что это ха байты?
Это выравнивание. Вы статью открывали вообще? Вот же сказано:
Цитата Сообщение от Статья из педивикии
Ряды, независимо от размера ячеек, обязательно должны дополняться нулями до кратного четырём байтам размера
0
3 / 3 / 0
Регистрация: 14.12.2020
Сообщений: 171
10.07.2023, 23:10  [ТС]
Замабувараев, до меня просто не дошло, что данные DrawingBuffer(), по сути BMP
Спасибо
0
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
29.07.2023, 08:14
Всех приветствую. Хотелось бы присоединиться к теме. Вот, допустим, я загружаю .bmp файл функцией LoadImage(). Первые два байта должны содержать символы "ВМ", и при считывании отображать 19778. Попробовал сделать так:
PureBasic
1
2
3
4
5
LoadImage(0, "D:\z.bmp") ; загружаем изображение
StartDrawing(ImageOutput(0))
*Buffer = DrawingBuffer() ; находим адрес изображения
Debug PeekW(*Buffer) ; просим отобразить первые два байта
StopDrawing()
Однако, у меня выводится совсем другое число. То есть, функция LoadImage() не подразумевает последовательную строку байтов, содержащую весь файл-изображение ? Что же тогда загружает в память LoadImage() ?
0
12 / 12 / 0
Регистрация: 02.07.2014
Сообщений: 115
29.07.2023, 08:42
drawingbufferpixelformat
drawingbufferpitch
0
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
29.07.2023, 09:03
Цитата Сообщение от useful Посмотреть сообщение
drawingbufferpixelformat
drawingbufferpitch
если это ответ на мой вопрос, то эти функции возвращают не то о чём спрашивал я.
0
12 / 12 / 0
Регистрация: 02.07.2014
Сообщений: 115
29.07.2023, 09:11
Они возвращают информацию, позволяющую понять как работать с памятью, указатель на которую возвращает
*Buffer = DrawingBuffer()
Учитывая, что PB проприетарный и мультиплатформенный, и структура буфера до StartDrawing() не документирована, то и искать информацию на эту тему нет смысла. Автор в любой следующей версии может формат изменить и на разных платформах он может отличаться.
А вот после вызова StartDrawing() есть три функции от автора позволяющие детально понять, что там в буфере.
0
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
29.07.2023, 09:43
Цитата Сообщение от useful Посмотреть сообщение
А вот после вызова StartDrawing() есть три функции от автора позволяющие детально понять, что там в буфере.
То есть, нативными средствами PB я могу лишь узнать адрес памяти, по которому хранится изображение, формат пикселей и длину одной линии изображения.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.07.2023, 09:43

Как записать данные в массив ?
Здравствуйте. Я хочу пройтись по некоторым ПК и собрать статистику. А далее проделать какую-нибудь операцию, допустим сортировка по...

Как записать данные в массив?
Пытаюсь сделать так, но массив оказуется пустой. В чем может быть проблема? require ('phpQuery/phpQuery.php'); $mas=array(); ...

Как записать нетипизированные данные в массив?
Осваиваюсь с c#, до этого только php Появился вопрос, как записать в массив следующие данные полученые из стороннего файла? автомобиль ...

Как пробежаться по БД и записать данные в массив?
В программировании не профи, по этому такой вопрос: Есть БД, где первый столбец это idQueue, второй - NumQueue, 3 - NameKlient,...

Как записать данные с файла в массив?
нужно считать с файла (.ТХТ) два столбца и записать их в массив. Также нужна возможность выбора этого файла в системе.


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru