Форум: "Media";
Текущий архив: 2003.04.17;
Скачать: [xml.tar.bz2];
ВнизКак через TBitmap.ScanLine достать весь масив байт образа картинк Найти похожие ветки
← →
Dima1 (2003-01-18 09:23) [0]Господа ! Почему, когда я создав свою DIB битмапку, функцией:
Var
BitmapInfo : TBitMapInfo;
LoadedBmp : HBitmap;
NewBmpArr : Pointer;
....
LoadedBmp := CreateDIBSection(DC, BitmapInfo, DIB_RGB_COLORS, NewBmpArr, 0, 0);
пытаюсь из стандартной TBitmap через ScanLine, в цикле, достать построчно байтовый образ картинки Tbitmap, и положить его в NewBmpArr^. Потом нарисовав,свою
LoadedBmp функцией:
SetDIBitsToDevice(Canvas.Handle,0,0,W,H,0,0,0,W,NewBmpArr,BitmapInfo,DIB_PAL_COLORS);
в итоге не получаю копию картинки TBitmap. Какоето размытие по полосам, я даже не знаю как это назвать... Цвета вроде те, но картинки и близко нет.
Почему.? Как мне из TBitmap, достать быстро и правильно тот масив байт.
По пикселам может быть, но canvas.Pixels[x,y] - ТОРМОЗ ! а мне скорость нужна.
P.S. из своей LoadedBmp на TBitmap я могу нарисовать картинку, темже BitBlt(), а вот обратно, вигня какая то получается. Наверное в TBitmap уже какой то другой, свой формат расположения байт образа картинки ??
← →
MBo (2003-01-18 11:06) [1]>Как мне из TBitmap, достать быстро и правильно тот масив байт.
GetDiBits
← →
Dima1 (2003-01-18 16:36) [2]спасибо, щас попробую
Я похоже эту функцию пока, еще не знал. :)
← →
int64 (2003-01-18 21:27) [3]
> пытаюсь из стандартной TBitmap через ScanLine, в цикле,
> достать построчно байтовый образ картинки Tbitmap, и положить
> его в NewBmpArr^. Потом нарисовав, свою LoadedBmp функцией:
Это ты для интереса делаешь? Или есть какой-то практический смысл?
← →
Dima1 (2003-01-19 01:40) [4]>Int64
Я сейчас занялся разбором ВМР формата, чтобы ускорить работу с графикой. TBitmap - разве это скорость, разве что DRAW(). А когда начинаешь рисовать по пикселам,... дальше я просто промолчу. В общем мне надо прямой доступ к масиву байт картинки(пикселам), TBitmap этого не дает, Pixels[] не подходит, разве что ScanLine, но там копируется строка, а это время. сначала ее получи, поковыряйся в ней, потом следующую, нет так тоже не пойдет. Хотел попробовать так,просто для примера. Есть, Image1 и Image2. В Im1 изначально загружена картинка еще при разработке, затем, я хотел вынять из нее этот самый масив, чтобы получить его в памяти, чтобы потом иметь к нему прямой доступ, и нарисовать тот масив на Im2 но уже другими функциями, в Win32. те что работают с DIB. Но тут получается вот такая вот лажа, которая изложена выше. Понятно что можно обычным Assign(). Но мне не это надо... Потом в будущем, мне на этой Im1 надо будет выводить, порядка 40 штук, разными цветами, в разных местах, сложные по форме картинки, да еще и разного размера, и при этом каждую картинку отрисовать каждый раз, сразу, и почти в реальном времени.
С обычным TBitmap эти вещи у меня не Celeron900/мама BX, GeForce2 100/200 раньше рисовались в итоге примерно 3сек. И это одна картинка, имеется в виду уже разукрашенная, готовая, а у меня таких в целом 12каринок. вот и умнож время. :(
Так это на моем компе, а есть же еще и намного послабее. правда я уже скорость отрисовки увеличил, до 0,5сек. каждую, темже прямым доступом к масиву картинки, но я знаю, что можно и еще увеличить.
А пока что мне надо просто выяснить почему, когда получаешь через ScanLine, вроде бы как, образ картинки из Im1, после новой его отрисовки, картинки все же НЕТ. есть только какой то мусор в итоге на Im2.
← →
A_n_t (2003-01-19 04:17) [5]Вот ссылки по теме:
http://delphigfx.mastak.ru/2d/012/2d_12.htm
http://delphigfx.mastak.ru/2d/007/2d_7.htm
http://delphigfx.mastak.ru/2d/010/2d_10.htm
А в принципе делается так:
берется DirectDraw и
1. Создается поверхность
(если нужно много работать с обработкой картинок, то создавать необходимо в системной памяти)
2. Lock поверхности
3. Получить ее адрес
4. Вытащить оттуда, что душе угодно: DWord, Word, Byte или свой тип
(вот то самое: “прямой доступ к массиву байт картинки”)
5. Произвести расчеты и запихнуть назад
6. UnLock поверхности
7. Кинуть ее на экран – в видео память
Чем меньше битность картинки, тем меньше ее размер и легче ее обрабатывать и кидать в видео.
P.S. А ScanLine для этого мало подходит.
← →
Dima1 (2003-01-19 11:03) [6]> a_n_t
Спасибо за ссылки.
А DirectDraw я не хочу использовать, в моем случае достаточно и DIB функций. А то потом тягай его за собой везде в инсталяшках.
Спасибо всем за помощь. Дальше я разберусь сам.
Удачи.
← →
int64 (2003-01-19 12:23) [7]Dima1 (19.01.03 01:40)
1)Повыкидывай все TImage. И не имей такой привычки: хранить данные в контролах форм. Тем более битмапы, и тем более в таком неповоротливом чуде, как TImage. Рисуй всё руками, тем более, если тянет на WinAPI. И не забывай про WM_Paint.
2)ScanLine никуда ничего не копирует, а получает указатель на строку. Другими словами, если представить bmBits как матрицу, то ScanLine-ом ты пробегаешь по строкам этой матрицы. Уверяю тебя, если будешь работать с bmBits своеручно, и если будешь юзать тот-же массив, но "нарезая" его, то разницы в производительности не получишь. Устреми свои труды на исправление, оптимизацию и повышение скорости других алгоритмов. Например сюда:
> после новой его отрисовки, картинки все же НЕТ. есть только
> какой то мусор в итоге на Im2
Здесь у тебя явно ошибка. И ScanLine тут не причём, он до сего момента работал нормально.
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2003.04.17;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c