Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786

Как сохранить картинку в файл BMP или байтовый массив из Picture1.hdc

21.01.2025, 05:56. Показов 8489. Ответов 82
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как сохранить картинку в файл BMP или байтовый массив из Picture1.hdc

Может быть уже есть такая удобная функция, которая бы принимала в качестве параметра Picture1.hdc и/или Picture1.Image.handle и сохраняла бы картинку, не в битовую карту, а именно в файл BMP со всеми заголовками BMP.

Мне просто интересно, так сказать исходный код для сохранения картинки в BMP. Я сегодня кое что нашёл в Интернете для этих целей, но этого не достаточно.

Добавлено через 7 минут
Вот тут интересно очень почитать можно: https://moddb.fandom.com/wiki/... nformation

Добавлено через 11 минут
Вообще я знаю как очень легко сохранить Picture, но мне хотелось бы сохранить не Picture, а то что находится в hdc
Именно в файл!!! А не в битовую карту через GetDIBits.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.01.2025, 05:56
Ответы с готовыми решениями:

Сохранить картинку из DOC файла в другой файл jpg или bmp VBA
Добрый день господа ! Возникла проблемма необходимо вытащить картинки из DOC файла и сохранить их посредством VBA Возможно ли это? ...

Как сохранить байтовый массив в pdf файл?
Хочу написать обработчик который последовательно вынимает байтовые массивы из бд. В массивах хранятся pdf файлы. Как сохранить...

Как сохранить картинку из буфера обмена в файл bmp
Ребята, как с помощью WinAPI сохранить картинку из буфера обмена CF_DIB, в файл .bmp Совсем запутался.

82
1401 / 860 / 92
Регистрация: 08.02.2017
Сообщений: 3,668
Записей в блоге: 2
22.01.2025, 15:30
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от HackerVlad Посмотреть сообщение
Значит это неправильный порядок байтов
Это правильный порядок байтов для структуры, расположенной в памяти, поскольку там действует правило выравнивания, оно там нужно наверное для какого-либо удобства доступа, скорости м.б. А на диске выравнивание не нужно, с диска читается один раз и пишется один раз и потом долго хранится, более важна экономия места, такие мысли.
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
22.01.2025, 15:52  [ТС]
testuser2, это вместо того чтобы признать, что ты был неправ)))

Добавлено через 1 минуту
Цитата Сообщение от testuser2 Посмотреть сообщение
Это правильный порядок байтов для структуры
Но для BMP эти 00 00 не нужны, иначе BMP-файл просто испортится!

Добавлено через 32 секунды
А теперь мне нужно из этой структуры получить байтовый массив без этих 00 00

Добавлено через 1 минуту
Visual Basic
1
2
MsgBox Len(FileHeader) ' 14
MsgBox LenB(FileHeader) ' 16
Добавлено через 1 минуту
Короче про CopyMemory без разницы копирую я использую Len или LenB всё равно блин всовывает эти 00 00

Добавлено через 48 секунд
По сути наверное эти 00 00 они наверное итак содержатся в памяти мне кажется, вроде как после Integer в структуре 00 00 подсовывается незаметно так

Добавлено через 2 минуты
Вопрос у меня простой: как скопировать структуру в байтовый массив

Visual Basic
1
2
3
4
5
6
7
8
Private Type BITMAPFILEHEADER
    bfType As Integer
    ' Чтобы вот тут вот не вставляло два лишних байта 00  00
    bfSize As Long
    bfReserved1 As Integer
    bfReserved2 As Integer
    bfOffBits As Long
End Type
Вот как?

Добавлено через 1 минуту
И вообще нахрена оно вставляет два лишних байта?

Добавлено через 2 минуты
Это конечно бред но на ум приходит только копировать сначала bfType потом bfSize и так далее

Добавлено через 40 секунд
А может без CopyMemory обычным присвоением вообще "скопировать" байты?

Добавлено через 43 секунды
Не, обычным присвоение точно не получится, так как в массиве байт идут As Byte позиции а не As Integer

Добавлено через 2 минуты
Я провёл эксперемент и решил выяснить значения VarPtr(FileHeader.bfType) и сразу следующей переменной VarPtr(FileHeader.bfSize) и выяснилось что разница на 4 а не на 2 нахрена ОНО так делает я не понимаю

Добавлено через 4 минуты
Всё! Я придумал как по хитрому скопировать эту структуру правильно, вот так вот:

Visual Basic
1
2
            CopyMemory BmpFileData(0), ByVal VarPtr(FileHeader.bfType), 2
            CopyMemory BmpFileData(2), ByVal VarPtr(FileHeader.bfSize), Len(FileHeader) - 2
Добавлено через 15 секунд
Через 2 CopyMemory только. Одним CopyMemory не получится)
0
1401 / 860 / 92
Регистрация: 08.02.2017
Сообщений: 3,668
Записей в блоге: 2
22.01.2025, 15:53
Цитата Сообщение от HackerVlad Посмотреть сообщение
Вопрос у меня простой: как скопировать структуру в байтовый массив
Ты имееш в виду прочитать с диска?
Visual Basic
1
2
        Put #FileNo, 1, FileHeader
        Get #FileNo, 1, FileHeader2
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
22.01.2025, 15:57  [ТС]
Я не понимаю только почему сохранение в файл работает корректно одной строчкой кода и вырезает эти два лишних нуля

Добавлено через 1 минуту
Структуру BITMAPFILEHEADER я уже перегнал в обычный байтовый массив вот так вот (с вырезанием лишних 00 00):

Visual Basic
1
2
CopyMemory BmpFileData(0), VarPtr(FileHeader.bfType), 2
CopyMemory BmpFileData(2), VarPtr(FileHeader.bfSize), Len(FileHeader) - 2
0
1401 / 860 / 92
Регистрация: 08.02.2017
Сообщений: 3,668
Записей в блоге: 2
22.01.2025, 15:57
Т.е., зная где начинается хедер, надо сначала считать хедер, а потом уже там как-то из хедера берется смещение, по которому находятся данные и читать уже по этому смещению данные в байтовый массив. Но это там похоже вроде на мозгодрочку, ведь форматы bmp бывают разные, там какие-то палитры ни палитры, я бы не стал связываться
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
22.01.2025, 16:01  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
похоже вроде на мозгодрочку
Я уже полностью сделал эту мозгодрочку, полностью написал код, осталось только красоту навести

Добавлено через 54 секунды
Байтовый массив для меня - это не битовая карта, а полностью весь файл BMP

Добавлено через 48 секунд
Цитата Сообщение от testuser2 Посмотреть сообщение
там какие-то палитры ни палитры
Палитры тоже все учёл

Добавлено через 27 секунд
Цитата Сообщение от testuser2 Посмотреть сообщение
я бы не стал связываться
А мне просто интересно было, я ради спортивного интереса это написал всё
1
1401 / 860 / 92
Регистрация: 08.02.2017
Сообщений: 3,668
Записей в блоге: 2
22.01.2025, 16:02
В Твин-бейсике ты можешь задать побитовое однобайтное выравнивание для структуры и скопировать ее "типо правильно" из байтового массива, но использовать эту структуру в каких-то функциях уже не получится правильно.
Visual Basic
1
2
3
4
5
6
7
[PackingAlignment(1)]
Private Type MyUDT
    x As Integer
    y As Long
    z As Integer
End Type
Private t As MyUDT
1
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
22.01.2025, 17:25  [ТС]
Внимание всем!!!
Я только что узнал, что существует два подразделения:

1. Picture1.Picture - полная область картинки минус то что ты сам нарисуешь (не видно)
2. Picture1.Image - ограниченная прямоугольником видимости на экране картинка плюс то что ты сам нарисуешь (видно)

И две эти вещи - это hBitmap оказывается!!!

Добавлено через 2 минуты
А так же стандартные функции сохранения картинки сохраняют в 24 бита, а 32 бита они не поддерживают.

Добавлено через 13 минут
До сегодняшнего дня я даже не знал, что существуют 32-битные BMP с альфа-каналом, пока The trick мне не сказал, стандартные функции Windows сохраняют BMP же в 24 бита, без всяких там прозрачностей. Честно, я просто ни разу в жизни ещё не видел BMP-файл с прозрачносятми!!!!!!!!!!

Добавлено через 1 минуту
Но тот проект от The trick, возможно, как раз это и делает. Сохраняет с прозрачносятями наверное. Сейчас это проверю.

Добавлено через 1 минуту
Сейчас я даже смею предположить что hBitmap это и есть stdPicture

Добавлено через 2 минуты
stdPicture.Handle вернее это hBitmap
Я столько всего много нового узнал, методом тыка...

Добавлено через 43 секунды
С графикой я просто ещё не работал раньше, особо

Добавлено через 10 минут
Я определённо прокачал свои знания конечно, а некоторые думают, нахрена я это делаю, мол зачем мне это надо вообще всё, если есть стандартные функции которыми можно тупо пользоваться...

Добавлено через 6 минут
Для меня так же было новостью что в hdc картинки нет оказывается... Я всегда думал что картинка засоывавается в hdc когда рисуешь через API
0
1401 / 860 / 92
Регистрация: 08.02.2017
Сообщений: 3,668
Записей в блоге: 2
22.01.2025, 17:26
Я бы хотел сделать, али найти такую прогу. Берешь, допустим, выделяешь область вручную, скринишь, потом проматываешь колесиком, опятт скринишь, и чтобы этот скрин автоматически сращивался с предыдущим, чтобы автоматически определялся шов, по которому можно сращивать два снимка..

Добавлено через 59 секунд
Так, мечта просто...
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
22.01.2025, 17:35  [ТС]
testuser2, я на VBA кстати видел где-то пример сращивания картинок

Добавлено через 40 секунд
Цитата Сообщение от testuser2 Посмотреть сообщение
Так, мечта просто...
Могу поискать и дать ссылку, там уже пол твоей мечты, если не больше, написано уже

Добавлено через 2 минуты
testuser2, нашёл: https://www.devhut.net/vba-wia... ng-images/
как раз вчера забрёл на этот веб-ресурс, в своих безумных попытках найти идеальный код)))
1
1401 / 860 / 92
Регистрация: 08.02.2017
Сообщений: 3,668
Записей в блоге: 2
22.01.2025, 17:36
HackerVlad, интересно, но если я буду делать, то не сегодня, не знаю когда
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
22.01.2025, 17:37  [ТС]
testuser2, там, как видишь, есть вертикальное слияние картинок и горизонтальное слияние картинок, и всё уже написано
0
1401 / 860 / 92
Регистрация: 08.02.2017
Сообщений: 3,668
Записей в блоге: 2
22.01.2025, 17:40
HackerVlad, ты прям как ИИ, только задал вопрос, уже ответ, спасибо ))
1
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
22.01.2025, 17:44  [ТС]
Так что я нашёл твою мечту))) Посмотри внизу комменты)))
Миниатюры
Как сохранить картинку в файл BMP или байтовый массив из Picture1.hdc  
1
1401 / 860 / 92
Регистрация: 08.02.2017
Сообщений: 3,668
Записей в блоге: 2
22.01.2025, 17:48
Интригующие комментарии ))
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
22.01.2025, 18:36  [ТС]
Итак, вернёмся к моей основной теме. Да, я проверил только что работу проекта от The trick под названием Png2Bmp и ДА я действительно сейчас убедился в том, что BMP-файлы действительно реально сохраняются в 32 бита с альфа-каналом, с прозрачностью!!! Однако, тут есть одно очень большое НО, большинство просмотрщиков не видят эту прозрачность в BMP. Включая стандартный просмотрщик изображений Windows 7, в десятке наверное уже видит, но у меня нет десятки, не могу проверить. И старый фотошоп 7.0 даже не видит эту прозрачность в BMP.

Добавлено через 1 минуту
Таким образом сегодня я впервые в своей жизни увидел BMP файлы с прозрачностью, в полном шоке сейчас от этого нахожусь. Раньше я всегда всю жизнь думал что таких файлов не бывает у BMP, думал, что нет никакой прозрачности...

Добавлено через 1 минуту
Учитывая, что стандартные функции Windows не сохраняют BMP файлы с прозрачность, наверное, именно поэтому The trick и создавал сам сохранял BMP файлы с нуля своим кодом использую заголовочные структуры и так далее...

Добавлено через 8 минут
Элемент управления Image1 при загрузке таких 32-битных BMP делает черноту вокруг вместо прозрачности (удивляюсь как он вообще загрузил 32-битную BMP)

Добавлено через 3 минуты
Все стандартные виндовские коды сохранения в BMP сохраняют в 24 бита, не в 32 бита. А работать с 32-битными BMP мало кто умеет вообще...
0
 Аватар для Mikle Quits
785 / 308 / 17
Регистрация: 21.01.2023
Сообщений: 528
22.01.2025, 19:31
Цитата Сообщение от HackerVlad Посмотреть сообщение
Учитывая, что стандартные функции Windows не сохраняют BMP файлы с прозрачность
GDI+ прекрасно это делает.
1
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
22.01.2025, 22:53  [ТС]
Цитата Сообщение от Mikle Quits Посмотреть сообщение
GDI+ прекрасно это делает
Я это тоже прекрасно делаю, вручную собирая файл, работать будет даже в Windows 98 так что)))

Добавлено через 4 минуты
Цитата Сообщение от The trick Посмотреть сообщение
Вот тут есть сохранение 32 битного BMP
Я у тебя в твоём проекте нашёл один недочёт. Ты сохраняешь в BMP так же и палитру, но я заметил, что программные коды функций от Microsoft не сохраняют палитру, тем самым экономя 4 байта файла.

Добавлено через 2 часа 36 минут
Палитра нужна только в битрейтах:

1 бит - это 2 цвета
4 бит - это 16 цветов
8 бит - это 256 цветов

В 16, 24 и 32 бита палитра не нужна, даже лишние 4 байта, заполненных нулями, тоже ставить не нужно
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
22.01.2025, 23:09
HackerVlad, winapi как раз и работает с такой прозрачностью (к примеру слоеные окна, GDI+, DWM, AlphaBlend). Формат должен быть с premultiplied-alpha.
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
22.01.2025, 23:31  [ТС]
The trick, ну я пробовал сохранять через SavePicture - понятное дело 32 бита не тянет, потом пробовал через объект WIA - тоже только 24 бита максимум, GDI+ API вроде только 32 бита может сохранить...

Добавлено через 2 минуты
А ещё я пробовал через интерфейс сохранять то есть это IPicture.SaveAsFile там тоже 32 бита не поддерживает, только 24
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.01.2025, 23:31

Как сделать Picture1.hDC динамичным?
Privet. podskajitye pojalusta u minya est takoy kod. Private Declare Function SetPixelV Lib 'gdi32' (ByVal hDC As Long, ByVal x...

Как сохранить хэндл иконки в файл bmp или ico?
Люди! Кто-нить может подсказать: есть хэндл иконки, как эту иконку сохранить куда-нибудь в файл bmp или ico?

Как сохранить содержимое HDC в графический файл?
Есть HDC с неким изображением. Надо сохранить изображение в файл. Как это сделать?

Как перевести картинку в байтовый массив?
Следующим образом принимаю файл в контроллере и сохраняю картинку без проблем. КОнтроллер: $img = $_POST; echo...

Как сохранить картинку *.bmp в MSSQL
Доброго времени суток. Есть таблица sotrudniki, содержащая поля fio(фио сотрудника), tab_num(табельный номер), iso(фотография сотрудника) в...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
сукцессия 6. Питон реализация энилоджиковской модели, картинка про Центральную часть будущей модели
anaschu 26.06.2026
Етить. ИИ мне на основе моего старого файла R создал вот эту вот хмерь на пайтоне. Это уже новая модель, модель сукцессии грибной. потоки фосфора, азота. Углерода. 5 видов организмов. Я даже. . .
Как замкнутый ядерный цикл решит проблему недостатки фосфора? Био миграция фосфора со дна океана
anaschu 26.06.2026
Биологический лифт: Концепция подъема фосфора со дна океана с помощью ЗЯТЦ Предлагаю на обсуждение альтернативу тяжелому промышленному бурению океанического дна. Вместо сложной инженерии мы можем. . .
сукцессия 5
anaschu 26.06.2026
ПЛАН РАЗРАБОТКИ математической модели сукцессии микоризных систем Переход AM → EcM (Endo + ErM) · Шумилов А. С. · ИФХиБПП РАН · Пущино · 2026 . . .
сукцессия 4
anaschu 25.06.2026
Более детализированный план разработки План доработки модели динамики микоризных симбиозов (EcM с гистерезисом) Цель: Реализовать логику переключения между эрикоидным (ErM) и эктомикоризным. . .
сукцессия 3
anaschu 25.06.2026
Примерный план работ по модели
сукцессия 2
anaschu 25.06.2026
параметризировочная калибровочная таблица будущей модели
Многофункциональное здание: как одно здание порождает конфликты требований, которые никто не планировал (мат мет мод 29)
anaschu 23.06.2026
Многофункциональное здание: как одно здание порождает конфликты требований, которые никто не планировал Материалы для обсуждения с МГСУ · 2026 Рисунки внутри приложенного ворд файла. Что за. . .
28. Конкретное развертывание плана номер 1 из поста номер 27
anaschu 22.06.2026
Можно ли из модели получить конкретные строительные требования? Честно — напрямую из текущей модели такие ответы не получить. Но цепочка логики есть, и она не такая длинная. Где разрыв . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru