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

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

28.05.2023, 16:32. Показов 4127. Ответов 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
Эксперт по электронике
7145 / 3324 / 342
Регистрация: 28.10.2011
Сообщений: 13,115
Записей в блоге: 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
Эксперт по электронике
7145 / 3324 / 342
Регистрация: 28.10.2011
Сообщений: 13,115
Записей в блоге: 7
28.06.2023, 12:33
Цитата Сообщение от nigri_lupus Посмотреть сообщение
А где палитру-то искать?
Она может быть в файле-картинке.
Во время загрузки картинки в память, она преобразуется в RGB.
0
3 / 3 / 0
Регистрация: 14.12.2020
Сообщений: 171
28.06.2023, 12:34  [ТС]
Мне в принципе важно, чтобы с BMP "сюрпризов" не было...
0
Эксперт по электронике
7145 / 3324 / 342
Регистрация: 28.10.2011
Сообщений: 13,115
Записей в блоге: 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
Эксперт по электронике
7145 / 3324 / 342
Регистрация: 28.10.2011
Сообщений: 13,115
Записей в блоге: 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
Эксперт по электронике
7145 / 3324 / 342
Регистрация: 28.10.2011
Сообщений: 13,115
Записей в блоге: 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
Сообщений: 117
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
Сообщений: 117
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
Ответ Создать тему
Новые блоги и статьи
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru