Что такое код getbitmapbits

GetBitmapBits

WinApi функция GetBitmapBits

Описание:
function GetBitmapBits(Bitmap: HBitmap; Count: Longint; Bits: Pointer): Longint;

Копиpует биты каpты бит в Bits.

Паpаметpы:
Bitmap: Идентификатоp каpты бит.

Count: Размеp Bits в байтах.

Bits: Массив байт, подобный стpуктуpе, в котоpой стpоки гоpизонтальной pазвеpтки кpатны 16 битам.

Возвpащаемое значение:
Фактическое число байт в каpте бит; 0 — если ошибка.

P.s.
По работе задался вопросом какой сервер заказать для организации работы 1С бухгалтерии версии 8.0, если учесть что 12 бухгалтеров будут работать в ней через терминал. Серверы должны быть такими что бы все работало быстро и без тормозов даже в момент всевозможных бухгалтерских выгрузок.? Может у кого был опыт подскажите ?

Материал взят из:
Русская спpавка по Windows API

CBitmap::GetBitmapBits

The actual number of bytes in the bitmap, or 0 if there is an error.

Specifies the number of bytes to be copied.

Points to the buffer that is to receive the bitmap. The bitmap is an array of bytes. The bitmap byte array conforms to a structure where horizontal scan lines are multiples of 16 bits.

Copies the bit pattern of the CBitmap object into the buffer that is pointed to by lpBits. The dwCount parameter specifies the number of bytes to be copied to the buffer. Use CGdiObject::GetObject to determine the correct dwCount value for the given bitmap.

Что такое формат пикселя HBITMAP, когда я получить растровую информацию с GetBitmapBits?

У меня есть HBitmap HBitmap. Я использую GetBitmapBits (HBITMAP, ширина * высота, буфер);

что формат пикселя записано в буфер?

Вы хотите использовать GetDIBits вместо этого.

Проверьте, что говорит MSDN об этом: GetDIBits

Всегда спрашивайте MSDN (при использовании Visual Studio)

Может быть разными, это зависит от точечного рисунка. Вот код, чтобы узнать:

Что такое код getbitmapbits

В функции GetBitmapBits мне непонятен последний параметр As Any. Прочитал, что это обозначает массив байтов, но если я пишу в вызове функции, скажем, arrA() (ну типа массив), барсик на меня матерится. Люди, обьясните плз, что делать .

Ответы Всего ответов: 4

А если arrA() as Byte ?

Ответить

Номер ответа: 1
Автор ответа:
C y R a x

Разработчик Offline Client

Вопросов: 180
Ответов: 4229

Добавлено: 16.03.03 14:30
Номер ответа: 2
Автор ответа:
Диман

Вопросов: 29
Ответов: 64

Добавлено: 16.03.03 15:34
Он у меня и так Byte.

Ответить

Функция GetBitmapBits

Описание : Функция GetBitmapBits копирует биты, из указанного растрового изображения, в буфер.
Операционная система : Windows NT 3.1 или выше; Windows 95 или выше
Библиотека : GDI32.dll

TBitmap Что работает быстрее TBitmap.Map или TBitmapData.GetScanline?

Вопрос

estra 101

estra 101

  • Продвинутый пользователь
  • Пользователи
  • 101
  • 368 сообщений

Метод доступа к пикселям TBitmapData.GetScanline работает быстрее чем TBitmap.Map с последующим циклом? Можете привести пример работы с TBitmapData.GetScanline?

Поделиться сообщением

Ссылка на сообщение
Поделиться на другие сайты

3 ответа на этот вопрос

Рекомендуемые сообщения

Похожий контент

Добрый день!
Решил покопаться в своей старой спрайтовой игрушке, чтобы освежить в памяти знания и состряпать что-нибудь новое. Возникли сомнения, нормально ли сделано графическое отображение, можно ли доработать.
Все спрайты в дизайнтайме распиханы по Timagelist-ам. На старте приложения я загружаю битмапы из имэджлистов в свои обджектлисты, подгоняя под нужный размер.
MeduzasBitmpAr : array [1..numofMeduzas] of TObjectList ;
Дальше рисую по таймеру в основном окне игры Tpaintbox.OnPaint:

В принципе, даже на слабеньких телефончиках, всё вроде бодро. Но может, опытные товарищи чего подскажут, а то я 3ий день в собственном соку варюсь, ничего толкового.

Пишу кроссплатформенное приложение. Результат поиска отображается в TGrid. Стал вопрос отображения картинки в одной из колонок.
На Windows все ок, но на планшете происходят просто чудеса: при первом отображение все корректно, но если простоколить вверх-вниз как картинки одни перетираются другими, часть вообще отображается вверх ногами.
Код для сохранение картинки(jpg) в базу:
if Assigned(sm) then begin sm.Position := 0; //TBlobField(dmData.cdsPlayerData.FieldByName(‘Photo’)).LoadFromStream(sm); vImage := TImage.Create(nil); try sm.Position := 0; vImage.Bitmap.LoadFromStream(sm); vKoef := vImage.Bitmap.Height / 64; vImage.Bitmap.Resize(Trunc(vImage.Bitmap.W )).LoadFromStream(sm); finally sm.Free; end; finally vImage.Free; end; end; До скрола:

Пробовал и LiveBinding, и ручную прорисовку — результат один и тот же. Есть идеи что не так?
P.S. Знаю что нужно делать через TListView, но заказчик хочет «сеточку как в старой программе», так как на android будет работать только на планшетах – я согласился.

Здравствуйте!
Стоит задача загружать фотографии и отображать их в списке. Казалось бы, как два пальца, но.
Код работал долгое время, все грузилось и отображалось. Спустя какое-то время, фото грузиться перестали. Дебаггинг выявил, замкнутый бесконечный цикл в этой процедуре:
procedure TBitmap.AssignFromSurface(const Source: TBitmapSurface); var BitmapData: TBitmapData; MaxSize: Integer; ResampledSurface: TBitmapSurface; I: Integer; SourceRect: TRectF; begin MaxSize := Canvas > MaxSize) or (Source.Height > MaxSize) then begin SourceRect := TRectF.Create(0, 0, Source.W > AssignFromSurface(ResampledSurface);

Кто-то сталкивался? Есть мысли как лечить?
Всем спасибо!

Добрый день. Существует одна проблема, с которой уже несколько недель не могу справиться. Есть старый код под WinAPI, его нужно переделать под Android через firemonkey. И главная проблема — есть код, который из собственного формата делает HBITMAP из WinAPI. Фактически это структура, где последнее поле — указатели на биты. Это переделать легко, создав собственную копию такой структуры. Но теперь мне нужно перевести ее в TBitmap, и я не очень понимаю как это сделать.

Delphi Seattle, Android 5.0.1
Формирую картинку через ScanLine. На выходе полученный битмап рисуется на полотне TImage, на котором перед этим был нарисован Rect.
GlobalBitmap — формированный tbitmap.
with ObjectPreviewImage.Bitmap.Canvas do begin BeginScene; Clear(TAlphaColorRec.White); DRect := TRectF.Create(0, 0, GlobalBitmap.W > Проблема собственно в чем — в андроидной версии слева и внизу рамка «съедается». В Win32 версии все отлично. На прилагаемых скриншотах это четко видно.
Документацию читал, гугл гуглил.

Что я делаю не так? Или это неизвестные подводные камни андроидного рисования на полотне?

P.S. Картинка одинаковая, цвет к определенной области применяется не верно. Походу тоже андроидные приколы. Но с этим я уже разберусь.
P.P.S. Уже разобрался с цветом — под андроидом Blue и Red в пикселе надо поменять местами. А насчет канвы — не получается никак.
P

Последние посетители 0 пользователей онлайн

Ни одного зарегистрированного пользователя не просматривает данную страницу

GetBitmapBits

Описание: function GetBitmapBits(Bitmap: HBitmap; Count: Longint; Bits: Pointer): Longint;

Копиpует биты каpты бит в Bits.

Паpаметpы:

Bitmap: Идентификатоp каpты бит.

Count: Размеp Bits в байтах.

Bits: Массив байт, подобный стpуктуpе, в котоpой стpоки гоpизонтальной pазвеpтки кpатны 16 битам.

Возвpащаемое значение:

Фактическое число байт в каpте бит; 0 — если ошибка. функция находится в файле gdi32.dll

Графический интерфейс GDI в Microsoft Windows

4.1. Битовые изображения в формате DDB

Как мы уже говорили, битовые изображения в формате DDB являются аппаратно-зависимыми. Поэтому структура изображения в оперативной памяти зависит от особенностей аппаратуры.

В предыдущих томах «Библиотеки системного программиста» мы использовали изображения DDB и даже приводили исходный текст функции DrawBitmap, с помощью которой можно нарисовать такое изображение на экране.

Как правило, изображения DDB либо загружаются из ресурсов приложения, либо создаются непосредственно в оперативной памяти. Для вывода изображений DDB на экран используются такие функции, как BitBlt и StretchBlt.

Изображения DIB, в отличие от изображений DDB, являются аппаратно-независимыми, поэтому без дополнительного преобразования их нельзя отображать на экране с помощью функций BitBlt и StretchBlt. В операционной системе Windows версий 3.х битовые изображения хранятся в файлах с расширением имени bmp, при этом используется аппаратно-независимый формат DIB.

Загрузка изображений из ресурсов приложения

Самый простой способ использования битовых изображений в приложениях Windows заключается в том, что изображение создается графическим редактором в виде bmp-файла и описывается в файле определения ресурсов приложения при помощи оператора BITMAP:

Созданное таким образом битовое изображение можно загрузить в память при помощи функции LoadBitmap :

Параметр hinst определяет идентификатор копии приложения, из ресурсов которого нужно загрузить изображение. Идентификатор ресурса изображения задан параметром lpszBitmap. Функция LoadBitmap возвращает идентификатор загруженного изображения или NULL при ошибке.

После использования приложение должно удалить битовое изображение. Для этого лучше всего воспользоваться макрокомандой DeleteBitmap , описанной в файле windowsx.h следующим образом:

В качестве параметра этой макрокоманде нужно передать идентификатор удаляемого изображения.

Приложение может определить параметры загруженного изображения, вызвав функцию GetObject :

С помощью этой функции можно получить разнообразную информацию об объектах GDI, таких, как логические перья, кисти, шрифты или битовые изображения.

Для нас интересно использование этой функции с целью получения параметров изображения. Идентификатор изображения должен передаваться через параметр hgdiobj. Параметр lpvObject должен указывать на структуру типа BITMAP, в которую будут записаны сведения об изображении. Через параметр cbBuffer следует передать размер структуры BITMAP:

Структура BITMAP и указатели на нее описаны в файле windows.h:

Опишем назначение отдельных полей этой структуры.

Номер ответа: 3
Автор ответа:
C y R a x

Разработчик Offline Client

Вопросов: 180
Ответов: 4229

Добавлено: 16.03.03 16:55
Поле Описание
bmType Тип битового изображения. Должен быть равен 0
bmWidth Ширина битового изображения в пикселах, должна быть больше 0
bmHeight Высота битового изображения в пикселах, должна быть больше 0
bmWidthBytes Размер памяти, занимаемый одной строкой растра битового изображения. Это значение должно быть четным, так как массив изображения состоит из целых чисел размером 16 бит. Таким образом, произведение bmWidthBytes*8 должно быть кратно 16. Кроме того, это произведение должно быть больше или равно произведению bmWidth*bmBitsPixel
bmPlanes Количество плоскостей в битовом изображении. В зависимости от типа видеоадаптера и его режима работы для представления цвета одного пиксела может использоваться несколько бит, расположенных в одной или нескольких плоскостях видеопамяти (подробное описание структуры видеопамяти в различных режимах вы можете найти в 3 томе «Библиотеки системного программиста»)
bmBitsPixel Количество битов, используемых для представления цвета пиксела. Если используется несколько плоскостей, то это поле содержит количество бит одной плоскости, используемых для представления цвета пиксела
bmBits Дальний указатель на массив, содержащий биты изображения

Загрузив битовое изображение из ресурсов приложения, вы можете определить его размеры, узнать количество цветовых плоскостей и количество бит в одной плоскости, определяющих цвет пиксела. Кроме этого, вы можете получить указатель на область памяти, содержащую биты изображения.

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

Пусть, например, вы подготовили с помощью графического редактора, входящего в состав приложения Resource Workshop, битовое изображение, показанное на рис. 4.1. Для наглядности каждая строка растра этого изображения пронумерована.

Рис. 4.1. Черно-белое битовое изображение

Этому представлению соответствует дамп памяти, представленный ниже:

Так как буфер, в котором хранится строка, должен иметь длину, кратную длине слова (два байта), буфер каждой строки дополняется нулем.

Обратите внимание, что для изображений DDB используется система координат, соответствующая режиму отображения MM_TEXT, т. е. система координат, принятая для устройства отображения.

Рисование изображения DDB

Итак, мы загрузили битовое изображение в память и определили его параметры. Теперь наша задача заключается в том, чтобы нарисовать загруженное изображение в окне приложения.

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

Используется следующая последовательность действий.

Прежде всего надо создать контекст памяти, совместимый с контекстом отображения реального устройства вывода. Для этого следует воспользоваться функцией CreateCompatibleDC.

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

Затем нужно скопировать биты изображения из контекста памяти в контекст отображения, вызвав функцию BitBlt или StretchBlt. При этом изображение будет нарисовано на устройстве вывода, которое соответствует контексту отображения.

Рассмотрим реализацию этой последовательности действий на примере функции DrawBitmap , которую мы использовали в приложениях, описанных в предыдущих томах «Библиотеки системного программиста»:

В качестве параметров этой функции передается идентификатор контекста отображения hDC, в котором необходимо нарисовать изображение, координаты x и y верхнего левого угла прямоугольной области, в которой будет нарисовано изображение, а также идентификатор самого изображения hBitmap.

Прежде всего функция DrawBitmap создает контекст памяти, совместимый с контекстом отображения, передаваемого через параметр hDC:

В качестве параметра для этой функции можно использовать значение NULL. В этом случае будет создан контекст памяти, совместимый с экраном видеомонитора. Функция возвращает идентификатор созданного контекста или NULL при ошибке.

Далее функция DrawBitmap выбирает изображение в созданный контекст памяти:

Функция SelectObject возвращает идентификатор битового изображения, которое было выбрано в контекст памяти раньше. Так как мы только что создали контекст памяти, мы получим идентификатор битового изображения, выбранного в контекст памяти по умолчанию. Это монохромное изображение, состоящее из одного пиксела. Контекст памяти необходимо удалить после использования. Перед удалением мы должны выбрать в него изображение, которое было выбрано при создании, т. е. изображение с идентификатором hOldbm.

Теперь мы выбрали наше изображение в контекст памяти и готовы выполнить копирование в контекст отображения. Однако перед этим необходимы некоторые подготовительные действия.

Прежде всего нужно сделать так, чтобы в контексте памяти использовался тот же режим отображения, что и в контексте отображения. По умолчанию при создании контекста памяти (как и любого другого контекста) устанавливается режим отображения MM_TEXT. Однако в контексте отображения, идентификатор которого передается функции DrawBitmap, может быть установлен любой режим отображения, например, метрический. Для обеспечения соответствия режимов отображения удобно использовать функции GetMapMode и SetMapMode :

Функция GetMapMode возвращает код режима отображения, установленного в контексте отображения. Этот код передается в качестве второго параметра функции SetMapMode, которая устанавливает такой же режим отображения в контексте памяти.

Так как функции BitBlt , копирующей биты изображения, необходимо указать координаты прямоугольной области, занимаемой изображением в контексте памяти, следует определить размеры изображения. Это можно сделать с помощью функции GetObject, которую мы только что описали:

В данном случае нас интересуют ширина и высота изображения в пикселах:

Так как в контексте отображения может быть выбран любой режим отображения, размеры изображения необходимо преобразовать в логические, вызвав функцию DPtoLP:

Об этой функции мы рассказывали в разделе, посвященной режимам отображения.

Для копирования битов изображения из контекста памяти в контекст отображения функция DrawBitmap использует функцию BitBlt (читается как «бит-блит»):

Функция копирует битовое изображение из исходного контекста hdcSrc в контекст отображения hdcDest. Возвращаемое значение равно TRUE при успешном завершении или FALSE при ошибке.

Размеры копируемого изображения задаются парамерами nWidth и nHeight. Координаты левого верхнего угла изображения в исходном контексте определяются параметрами nXSrc и nYSrc, а в контексте, куда копируется изображение, параметрами nXDest и nYDest.

Последний параметр dwRop определяет растровую операцию, используемую для копирования.

Отметим, что размеры и координаты необходимо задавать в логических единицах, соответствующих выбранному режиму отображения.

В нашем случае изображение копируется из точки (0,0) в физической системе координат в точку (x,y) в логической системе координат. Поэтому перед копированием изображения необходимо выполнить преобразование физических координат (0,0) в логические, вызвав функцию DPtoLP:

После этого можно вызывать функцию BitBlt:

Эта функция копирует битовое изображение, имеющее размеры ptSize, из контекста памяти hMemDC в контекст отображения hDC. При этом логические координаты верхнего левого угла изображения в контексте памяти находятся в структуре ptOrg. Координаты верхнего левого угла прямоугольной области в контексте отображения, куда будет копироваться изображение, передаются через параметры x и y.

После рисования битового изображения функция DrawBitmap выбирает в контекст памяти первоначально выбранное при его создании изображение, состоящее из одного монохромного пиксела, и затем удаляет контекст памяти:

В качестве кода растровой операции используется константа SRCCOPY. При этом цвет пикселов копируемого изображения полностью замещает цвет соответствующих пикселов контекста отображения.

Мы уже говорили об использовании растровых операций для рисования линий и закрашивания областей. При рисовании битовых изображений вы также можете использовать растровые операции, причем цвет полученного изображения в зависимости от выбранной растровой операции может определяться цветом исходного изображения, цветом поверхности, на которой выполняется рисование, и цветом кисти, выбранной в контекст отображения.

Чаще всего используется код растровой операции SRCCOPY. В этом случае цвет кисти, выбранной в контекст отображения, не имеет значения, так как ни цвет кисти, ни цвет фона не влияют на цвет нарисованного изображения.

Однако вы можете использовать и другие коды растровых операций (всего их 256). В этом случае для вычисления цвета полученного после рисования пиксела можно выбрать практически любое логическое выражение, учитывающее цвет фона, цвет кисти и цвет пиксела изображения.

В файле windows.h описаны константы для наиболее полезных кодов растровых операций. Мы опишем эти константы вместе с соответствующими логическими выражениями. При этом символом S мы будем обозначать цвет исходного изображения, символом D — цвет фона на котором выполняется рисование, и P — цвет кисти, выбранной в контекст отображения.

S

(S | D)

S | D

D

Код растровой операции Логическое выражение Описание
SRCCOPY S Исходное изображение копируется в контекст отображения
SRCPAINT S | D Цвет полученного изображения определяется при помощи логической операции ИЛИ над цветом изображения и цветом фона
SRCAND S & D Цвет полученного изображения определяется при помощи логической операции И над цветом изображения и цветом фона
SRCINVERT S ^ D Цвет полученного изображения определяется при помощи логической операции ИСКЛЮЧАЮЩЕЕ ИЛИ над цветом изображения и цветом фона
SRCERASE S &

D

Цвет фона инвертируется, затем выполняется операция И над результатом и цветом исходного изображения
NOTSRCCOPY После рисования цвет изображения получается инвертированием цвета исходного изображения
NOTSRCERASE Цвет полученного изображения получается инвертированием результата логической операции ИЛИ над цветом изображения и цветом фона
MERGECOPY P & S Выполняется логическая операции И над цветом исходного изображения и цветом кисти
MERGEPAINT Выполняется логическая операции ИЛИ над инвертированным цветом исходного изображения и цветом фона
PATCOPY P Выполняется копирование цвета кисти
PATPAINT P |

S | D

Цвет кисти комбинируется с инвертированным цветом исходного изображения, при этом используется логическая операция ИЛИ. Полученный результат комбинируется с цветом фона, также с помощью логической операции ИЛИ
PATINVERT P ^ D Цвет полученного изображения определяется при помощи логической операции ИСКЛЮЧАЮЩЕЕ ИЛИ над цветом кисти и цветом фона
DSTINVERT Инвертируется цвет фона
BLACKNESS Область закрашивается черным цветом
WHITENESS 1 Область закрашивается белым цветом

Остальные коды приведены в документации, которая поставляется вместе с SDK. В более удобном виде все коды растровых операций приведены в приложении к книге «Developing Windows 3.1 Application whit Microsoft C/C++» (автором которой является Brent Rector). Мы не будем воспроизводить полную таблицу для кодов растровых операций, так как во-первых, эти операции редко используются, а во-вторых, таблица занимает много места.

Для рисования битовых изображений можно использовать вместо функции BitBlt функцию StretchBlt , с помощью которой можно выполнить масштабирование (сжатие или растяжение) битовых изображений:

Параметры этой функции аналогичны параметрам функции BitBlt, за исключением того, что ширина и высота исходного и полученного изображения должна определяться отдельно. Размеры исходного изображения (логические) задаются параметрами nWidthSrc и nHeightSrc, размеры нарисованного изображения задаются параметрами nWidthDest и nHeightDest.

Возвращаемое значение равно TRUE при успешном завершении или FALSE при ошибке.

Следует упомянуть также еще одну функцию, которая сама по себе не может рисовать битовые изображения, но часто используется для закраски прямоугольных областей экрана. Эта функция имеет имя PatBlt :

При использовании этой функции вы можете закрашивать области экрана с использованием следующих кодов растровых операций: PATCOPY, PATINVERT, PATPAINT, DSTINVERT, BLACKNESS, WHITENESS.

Возвращаемое функцией PatBlt значение равно TRUE при успешном завершении или FALSE при ошибке.

Создание изображений в памяти

Другой способ работы с изображениями в формате DDB заключается в создании их непосредственно в оперативной памяти.

Вы должны подготовить массив, содержащий биты изображения, заполнить структуру типа BITMAP, которая описывает изображение, и затем вызвать функцию CreateBitmapIndirect , указав ей в качестве единственного параметра указатель lpbm на заполненную структуру типа BITMAP:

Функция вернет идентификатор битового изображения, который вы можете использовать обычным способом.

Как правило, в памяти создаются монохромные изображения небольших размеров. В этом случае структура битов изображения является достаточно простой.

Например, пусть нам надо нарисовать битовое изображение, показанное в увеличенном виде на рис. 4.2.

Рис. 4.2. Битовое изображение

Подготовим в памяти массив, описывающий это изображение. Каждая строка массива соответствует одной строке сканирования битового изображения:

При этом нам необходимо принимать во внимание, что размер одной строки сканирования изображения должен быть кратен 16 битам, т. е. двум байтам.

Однако сам по себе приведенный выше массив бит не содержит информации о размере изображения или о количестве бит, обозначающих цвет одного пиксела. Для формирования битового изображения необходимо подготовить структуру типа BITMAP, содержащую все необходимые сведения:

В этом массиве указаны размеры изображения (ширина — 64 пиксела, высота — 9 пикселов), размер памяти для одной строки сканирования в байтах (равен 8), количество цветовых плоскостей (одна) и количество бит, используемых для представления цвета одного пиксела (один бит). Указатель на массив бит будет проинициализирован непосредственно перед созданием изображения, так как сегмент данных может переместиться.

После того как массив данных и структура подготовлены, можно вызывать функцию CreateBitmapIndirect, передав ей в качестве параметра указатель на структуру:

Непосредственно перед вызовом функции CreateBitmapIndirect следует установить в структуре типа BITMAP указатель на массив бит изображения.

Есть еще одна возможность. Вы можете создать битовое изображение, вызвав функцию CreateBitmap :

Через параметры этой функции передаются значения, которые необходимо записать в структуру типа BITMAP перед вызовом функции CreateBitmapIndirect.

Функции CreateBitmap и CreateBitmapIndirect возвращают идентификатор созданного в памяти изображения, который можно использовать для выбора изображения в контекст памяти, или NULL при ошибке.

Другие функции для работы с изображениями DDB

Если вы создали изображение DDB, то пользуясь его идентификатором, нетрудно скопировать в него новый массив бит, соответствующий новому изображению. Для этой цели можно воспользоваться функцией SetBitmapBits :

Первый параметр этой функции предназначен для передачи идентификатора битового изображения. Параметр lpvBits является указателем на массив бит, размер этого массива задается при помощи параметра cBits.

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

Обратную операцию (чтение массива памяти изображения) можно выполнить при помощи функции GetBitmapBits :

Эта функция копирует байты изображения hbmp в массив lpvBits, причем размер массива указывается через параметр cbBuffer.

Функция возвращает количество скопированных в буфер байт в случае нормального завершения или нулевое значение при ошибке.

Если вам нужно создать цветное битовое изображение DDB, можно воспользоваться функцией CreateCompatibleBitmap :

Эта функция создает неинициализированное изображение шириной nWidth пикселов и высотой nHeight пикселов, причем формат изображения соответствует контексту отображения hdc.

Ваше приложение может выбрать неинициализированное изображение, созданное при помощи функции CreateCompatibleBitmap, в контекст памяти (совместимый с тем же контекстом отображения). Затем оно может нарисовать в контексте памяти все что угодно, используя обычные функции GDI, такие как LineTo (передавая им в качестве первого параметра идентификатор контекста памяти). После этого приложение может вызвать функцию BitBlt для отображения результата в окне приложения.

Если желательно создать удаляемое (discardable) битовое изображение, вместо предыдущей функции вы можете вызвать функцию CreateDiscardableBitmap :

Она имеет параметры, аналогичные параметрам функции CreateCompatibleBitmap. Если изображение, созданное с использованием этой функции, не выбрано в контекст памяти, оно может быть удалено. При попытке выбрать в контекст удаленное изображение функция SelectBitmap вернет нулевое значение. В этом случае необходимо удалить изображение макрокомандой DeleteBitmap, после чего создать его заново.

IMediaDet::GetBitmapBits method

[Deprecated. This API may be removed from future releases of Windows.]

The GetBitmapBits method retrieves a video frame at the specified media time. The returned frame is always in 24-bit RGB format.

Syntax

Parameters

Time at which to retrieve the video frame, in seconds.

Receives the required buffer size. If pBuffer is NULL, the variable receives the size of the buffer needed to retrieve the frame. If pBuffer is not NULL, this parameter is ignored.

Pointer to a buffer that receives a BITMAPINFOHEADER structure followed by the DIB bits.

Width of the video image, in pixels.

Height of the video image, in pixels.

Return value

Returns an HRESULT value. Possible values include the following:

Return code Description
S_OK Success.
E_NOINTERFACE Could not add the Sample Grabber filter to the graph.
E_OUTOFMEMORY Insufficient memory.
E_POINTER NULL pointer error.
E_UNEXPECTED Unexpected error.
VFW_E_INVALIDMEDIATYPE Invalid media type.

Remarks

To determine the size of the buffer that is required, call this method with pBuffer equal to NULL. The size is returned in the variable pointed to by pBufferSize. Then create the buffer and call the method again, with pBuffer equal to the address of the buffer. When the method returns, the buffer contains a BITMAPINFOHEADER structure followed by the bitmap. The bitmap is scaled to the dimensions specified in the Width and Height parameters.

This method puts the media detector into bitmap grab mode. Once this method has been called, the various stream information methods in IMediaDet do not work, unless you create a new instance of the media detector.

The header file Qedit.h is not compatible with Direct3D headers later than version 7.

To obtain Qedit.h, download the Microsoft Windows SDK Update for Windows Vista and .NET Framework 3.0. Qedit.h is not available in the Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 Service Pack 1.

Examples

The following code uses the GetBitmapBits method to create a device-independent bitmap.

C#: имитация функции gdi GetBitmapBits и GdiFlush для заполнения массива байтов растровым изображением

Я создал библиотеку, в которой мне нужно заполнить байтовый массив из 307200 элементов (320x240x4 (= 32 бита)) в правильном порядке для растрового изображения, дисплей использует формат RGBA, и я хотел бы избежать использования взаимодействия для использования GetBitmapBits, поскольку я Я делаю в настоящее время, в то время как я предпочитаю писать это в коде C#, чтобы понять, как байты печатаются на нем.

Кто-нибудь может мне помочь?

Вот мой фактический код

Другое дело, быстрее ли GetBitmapBits, чем любая реализация, которую я могу сделать в C#?

1 ответ

Возможно, для Вашего проекта будут необходимы бесплатные векторные карты. На нашем сайте представлены карты для всех стран.

Создание, показывая, и затем получая доступ к данным о битовом массиве/DIB (w/o GetBitmapBits ())

Я унаследовал старо-школьный MFC программа Windows CE и должен сделать некоторые модификации к ней. Как часть этого я должен создать монохромное изображение с текстом на нем и обоими показами это на экране, а также послать каждый ряд изображения к принтеру по одному.

Я первоначально использовал битовый массив и имел использование успеха DrawText() и получение испытательной последовательности (Привет Мир), чтобы показать на экране (этот код находится в рисунке 1). Однако я врезался в стену на стадии, где я надеюсь извлекать данные об обертке из битового массива. То, что я пытаюсь получить, является множеством с 1 с или 0s, представляющим черный или белый. Я сначала думал, что буду использовать GetBitmapBits (), но к сожалению код, с которым я работаю, так стар, что функция еще не поддерживается. Я думал, что мог обойти эту проблему при помощи GetBitmap() и затем доступ к bmBits параметру. Однако, это, кажется, всегда пустое, который был подтвержден, когда я нашел следующую ссылку: Почему GetObject возвращает БИТОВЫЙ МАССИВ с пустым указателем bmBits?.

Моя следующая попытка состояла в том, чтобы последовать совету в связи и использовать CreateDIBSection() вместо CreateCompatibleBitmap (). Это походит на правильный путь, и у меня должен быть доступ к данным, которые я хочу, но к сожалению я не могу заставить DIB показывать (код находится в рисунке 2). Я подозреваю, что делаю что-то не так в создании заголовка DIB, но я не могу выяснить, какова моя ошибка.

Если у кого-либо есть предложения для способа получить доступ к данным в битовом массиве или видеть то, что я делаю неправильно с DIB, я был бы очень признателен за помощь!

*** РИСУНОК 1: Кодекс, чтобы создать и показать битовый массив

*** РИСУНОК 2: Попытка использовать DIB вместо битового массива

Илон Маск рекомендует:  Разработка internet приложений с использованием borland delphi и kylix
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL