TBitmap
Подскажет ли кто, как получить указатель (или ссылку) на область, собственно самих данных, в субже?
Привет усем!
Подскажет ли кто, как получить указатель (или ссылку) на область, собственно самих данных, в субже?
Что значит на область данных?
TBitmap->Canvas->Handle возвращает HDC - графический контекст и ты сможешь рисовать, что захочешь;
TBitmap->Handle возвращает HBITMAP - handle самого битмэпа, т.е. можно назначить ему другой handle другого битмэпа и его данные будут другими;
VAL = GetPixel(TBitmap->Canvas->Handle, X, Y)возвратит цвет точки в (X, Y).
Еще там как-то можно получить PixelArray, но я не помню уже как. :D
Что значит на область данных?
TBitmap->Canvas->Handle возвращает HDC - графический контекст и ты сможешь рисовать, что захочешь;
TBitmap->Handle возвращает HBITMAP - handle самого битмэпа, т.е. можно назначить ему другой handle другого битмэпа и его данные будут другими;
VAL = GetPixel(TBitmap->Canvas->Handle, X, Y)возвратит цвет точки в (X, Y).
Еще там как-то можно получить PixelArray, но я не помню уже как. :D
Каюся, не так сформулировал :) Мне надо, найти, где хранятся сами данные битмапа, в смысле сами индексы на таблицу цветов (так, что-ли?).
Каюся, не так сформулировал :) Мне надо, найти, где хранятся сами данные битмапа, в смысле сами индексы на таблицу цветов (так, что-ли?).
Индексы? Всмысле, сами индексы цветов пикселей? А для чего это тебе?
BITMAP BitmapStruct;
GetObject(TBitmap->Handle, sizeof(BITMAP), &BitmapStruct);
Так вот, теперь поле bmBits структуры BitmapStruct дожно содержать дальний long указатель на данные битмэпа (указатель типа void *):
long BitmapPointer = BitmapStruct.bmBits
Только вот не знаю наверняка - а помещает ли эту инфу класс TBitmap... В общем, надо порыться в исходниках TBitmap. Но тут еще есть проблема: а если битов на цвет, к примеру, 4? Тут уже надо как-то выдирать с помощью логики. Или можно создать DIBSECTION с 24-хразрядным растром. Или лучше написать свой класс TBitmap... В общем, смотреть надо.
Индексы? Всмысле, сами индексы цветов пикселей? А для чего это тебе?
Вообщем, тема такая:
Есть видеоролик (без звука). Воспроизводить его надоть таким образом:
1. Получили из файла первый кадр. Это будет, ну например, не пожматый BM.
Далее формат такой: эта картинка бьется на фреймы (квадраты, терминология
заказчика :) ), к примеру 64x64 т.е. 10x7 фреймов (по размеру картинки).
2. Берем 1 (первый) фрейм. Считаем 64 построчных контрольки (CRC). < Как раз тут и нужон мне доступ к этой лабуде.
3. Получаем из файла CRC для первой строчки этого фрейма.
4. Сравниваем.
5. Если !=, то читаем из файла данные для этой строчки.
6. Выводим.
И т.д. для всех строк этого фрейма. Потом следующий, и т.д. и т.д.
P.S. Почему нельзя вывести этот хренов ролик обычными средствами, в нормальном
формате, не знаю. Человек я подневольный .... :)
Вообщем, тема такая:
Есть видеоролик (без звука). Воспроизводить его надоть таким образом:
1. Получили из файла первый кадр. Это будет, ну например, не пожматый BM.
Далее формат такой: эта картинка бьется на фреймы (квадраты, терминология
заказчика :) ), к примеру 64x64 т.е. 10x7 фреймов (по размеру картинки).
2. Берем 1 (первый) фрейм. Считаем 64 построчных контрольки (CRC). < Как раз тут и нужон мне доступ к этой лабуде.
3. Получаем из файла CRC для первой строчки этого фрейма.
4. Сравниваем.
5. Если !=, то читаем из файла данные для этой строчки.
6. Выводим.
И т.д. для всех строк этого фрейма. Потом следующий, и т.д. и т.д.
P.S. Почему нельзя вывести этот хренов ролик обычными средствами, в нормальном
формате, не знаю. Человек я подневольный .... :)
Тогда я не понимаю зачем тут нужен именно TBitmap. Можно обойтись и без него. Получается, что ты читаешь файл напрямую и тебе теперь его надо отобразить на экране? Содержимое фрейма?
Тогда я не понимаю зачем тут нужен именно TBitmap. Можно обойтись и без него. Получается, что ты читаешь файл напрямую и тебе теперь его надо отобразить на экране? Содержимое фрейма?
Варианты?
Хе, совсем забыл. Похоже, что с получением адреса через 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);
Можно не только на форму, конечно. Можно сделать какой-нибудь TBitmap, как буфер, а потом получив его контекст (HDC DC; DC = GetDC(Bitmap1->Canvas->Handle), бацать прямо в него попутно еще и вставляя в него что угодно, там, к примеру, надписи.
Блин, получилось!!!
Спасибо. Исчерпывающе. Премного Вами благодарен!
:)
З.Ы.: Пивка бы выслал, да города такого не знаю! :)