Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

TBitmap

9
29 марта 2003 года
Lerkin
3.0K / / 25.03.2003
Привет усем!

Подскажет ли кто, как получить указатель (или ссылку) на область, собственно самих данных, в субже?
443
29 марта 2003 года
REmindER
292 / / 23.03.2003
Цитата:
Originally posted by Lerkin
Привет усем!

Подскажет ли кто, как получить указатель (или ссылку) на область, собственно самих данных, в субже?


Что значит на область данных?
TBitmap->Canvas->Handle возвращает HDC - графический контекст и ты сможешь рисовать, что захочешь;
TBitmap->Handle возвращает HBITMAP - handle самого битмэпа, т.е. можно назначить ему другой handle другого битмэпа и его данные будут другими;
VAL = GetPixel(TBitmap->Canvas->Handle, X, Y)возвратит цвет точки в (X, Y).

Еще там как-то можно получить PixelArray, но я не помню уже как. :D

9
29 марта 2003 года
Lerkin
3.0K / / 25.03.2003
Цитата:
Originally posted by REmindER

Что значит на область данных?
TBitmap->Canvas->Handle возвращает HDC - графический контекст и ты сможешь рисовать, что захочешь;
TBitmap->Handle возвращает HBITMAP - handle самого битмэпа, т.е. можно назначить ему другой handle другого битмэпа и его данные будут другими;
VAL = GetPixel(TBitmap->Canvas->Handle, X, Y)возвратит цвет точки в (X, Y).

Еще там как-то можно получить PixelArray, но я не помню уже как. :D



Каюся, не так сформулировал :) Мне надо, найти, где хранятся сами данные битмапа, в смысле сами индексы на таблицу цветов (так, что-ли?).

443
29 марта 2003 года
REmindER
292 / / 23.03.2003
Цитата:
Originally posted by Lerkin


Каюся, не так сформулировал :) Мне надо, найти, где хранятся сами данные битмапа, в смысле сами индексы на таблицу цветов (так, что-ли?).


Индексы? Всмысле, сами индексы цветов пикселей? А для чего это тебе?

443
31 марта 2003 года
REmindER
292 / / 23.03.2003
Как мне помнится, можно получить структуру битмэпа через его handle:

BITMAP BitmapStruct;

GetObject(TBitmap->Handle, sizeof(BITMAP), &BitmapStruct);

Так вот, теперь поле bmBits структуры BitmapStruct дожно содержать дальний long указатель на данные битмэпа (указатель типа void *):

long BitmapPointer = BitmapStruct.bmBits

Только вот не знаю наверняка - а помещает ли эту инфу класс TBitmap... В общем, надо порыться в исходниках TBitmap. Но тут еще есть проблема: а если битов на цвет, к примеру, 4? Тут уже надо как-то выдирать с помощью логики. Или можно создать DIBSECTION с 24-хразрядным растром. Или лучше написать свой класс TBitmap... В общем, смотреть надо.
9
31 марта 2003 года
Lerkin
3.0K / / 25.03.2003
Цитата:
Originally posted by REmindER

Индексы? Всмысле, сами индексы цветов пикселей? А для чего это тебе?



Вообщем, тема такая:

Есть видеоролик (без звука). Воспроизводить его надоть таким образом:

1. Получили из файла первый кадр. Это будет, ну например, не пожматый BM.
Далее формат такой: эта картинка бьется на фреймы (квадраты, терминология
заказчика :) ), к примеру 64x64 т.е. 10x7 фреймов (по размеру картинки).
2. Берем 1 (первый) фрейм. Считаем 64 построчных контрольки (CRC). < Как раз тут и нужон мне доступ к этой лабуде.
3. Получаем из файла CRC для первой строчки этого фрейма.
4. Сравниваем.
5. Если !=, то читаем из файла данные для этой строчки.
6. Выводим.

И т.д. для всех строк этого фрейма. Потом следующий, и т.д. и т.д.

P.S. Почему нельзя вывести этот хренов ролик обычными средствами, в нормальном
формате, не знаю. Человек я подневольный .... :)

443
31 марта 2003 года
REmindER
292 / / 23.03.2003
Цитата:
Originally posted by Lerkin


Вообщем, тема такая:

Есть видеоролик (без звука). Воспроизводить его надоть таким образом:

1. Получили из файла первый кадр. Это будет, ну например, не пожматый BM.
Далее формат такой: эта картинка бьется на фреймы (квадраты, терминология
заказчика :) ), к примеру 64x64 т.е. 10x7 фреймов (по размеру картинки).
2. Берем 1 (первый) фрейм. Считаем 64 построчных контрольки (CRC). < Как раз тут и нужон мне доступ к этой лабуде.
3. Получаем из файла CRC для первой строчки этого фрейма.
4. Сравниваем.
5. Если !=, то читаем из файла данные для этой строчки.
6. Выводим.

И т.д. для всех строк этого фрейма. Потом следующий, и т.д. и т.д.

P.S. Почему нельзя вывести этот хренов ролик обычными средствами, в нормальном
формате, не знаю. Человек я подневольный .... :)


Тогда я не понимаю зачем тут нужен именно TBitmap. Можно обойтись и без него. Получается, что ты читаешь файл напрямую и тебе теперь его надо отобразить на экране? Содержимое фрейма?

9
31 марта 2003 года
Lerkin
3.0K / / 25.03.2003
Цитата:
Originally posted by REmindER

Тогда я не понимаю зачем тут нужен именно TBitmap. Можно обойтись и без него. Получается, что ты читаешь файл напрямую и тебе теперь его надо отобразить на экране? Содержимое фрейма?

9
31 марта 2003 года
Lerkin
3.0K / / 25.03.2003
Варианты?
443
05 апреля 2003 года
REmindER
292 / / 23.03.2003
Цитата:
Originally posted by Lerkin
Варианты?


Хе, совсем забыл. Похоже, что с получением адреса через BITMAP.bmBits нифига не выйдет: пересмотрев весь исходник TBitmap, я нигде не увидел использование этого члена структуры. Ладно, в общем, можно попытаться сделать через CreateDIBSection:

BITMAPINFO bi;
BITMAPINFOHEADER bih;
RGBQUAD rgbq;

bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biWidth = 32;
bih.biHeight = -32;
bih.biPlanes = 1;
bih.biBitCount = 24;
bih.biCompression = BI_RGB;
bih.biSizeImage = 0;
bih.biXPelsPerMeter = 0;
bih.biYPelsPerMeter = 0;
bih.biClrUsed = 0;
bih.biClrImportant = 0;

//Битмэп размером 32х32 и глубиной цвета 24 бита некомпрессированный.

bi.bmiHeader = bih;
bi.bmiColors[1] = rgbq;

long *DIBBitsPointer;

HBITMAP BitmapHeader;

BitmapHeader = CreateDIBSection(NULL, (BITMAPINFO *) &bi, DIB_RGB_COLORS, (void**) &DIBBitsPointer, NULL, 0);

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

HDC DC;
DC = GetDC(Form1->Handle);

SetDIBitsToDevice(DC, 0, 0, 32, 32, 0, 0, 0, 32, DIBBitsPointer, &bi, 0);

443
05 апреля 2003 года
REmindER
292 / / 23.03.2003
Можно не только на форму, конечно. Можно сделать какой-нибудь TBitmap, как буфер, а потом получив его контекст (HDC DC; DC = GetDC(Bitmap1->Canvas->Handle), бацать прямо в него попутно еще и вставляя в него что угодно, там, к примеру, надписи.
9
07 апреля 2003 года
Lerkin
3.0K / / 25.03.2003
Цитата:
Originally posted by REmindER
Можно не только на форму, конечно. Можно сделать какой-нибудь TBitmap, как буфер, а потом получив его контекст (HDC DC; DC = GetDC(Bitmap1->Canvas->Handle), бацать прямо в него попутно еще и вставляя в него что угодно, там, к примеру, надписи.



Блин, получилось!!!
Спасибо. Исчерпывающе. Премного Вами благодарен!
:)

З.Ы.: Пивка бы выслал, да города такого не знаю! :)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог