![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вертикальный TBitmap.ScanLine
Димка На © (2012-03-20 17:13:00)Как вы поступаете, когда требуется вертикальное преобразование строки?
Rouse_ (2012-03-22 11:27:00) [1]Ну так я про нюансы по поводу сжатия и спрашивал :) Это-то я в курсе :)
han_malign (2012-03-22 11:16:00) [2]
> куда данные то денутся?
- это т.н. Packed DIB(и не забыть еще про палитру и BI_BITFIELDS), который - по большому счету - встречается только при сериализации.
В GDI указатель на буфер растра живет отдельно от заголовка:
1. CreateDIBSection - возвращается функцией - может быть опосредованно задан через hSection + dwOffset(file mapping)
2. GetObject(hDIB, sizeof(DIBSECTION), <DIBSECTION>) - <DIBSECTION>.dsBm.bmBits (и соответственно <DIBSECTION>.dshSection+dsOffset)
3. GetDIBBits - копия...
Другое дело, что ScanLine - возвращает указатель вэтот буфер, только нужно угадать где начало - ScanLine[0], или ScanLine[Height-1] - в зависмости от ориентации растра(знак DIBSECTION.dsBmр.biHeight).
Rouse_ (2012-03-21 22:20:00) [3]
> Pavia © (21.03.12 19:37) [8]
>
> Я про CreateDIBSection.
>
Эмм, я конечно давно с растром не работал, могу и ошибиться, но в чем нюанс? куда данные то денутся??
Pavia (2012-03-21 19:37:00) [4]Я про CreateDIBSection.
Rouse_ (2012-03-21 19:26:00) [5]
> Pavia © (21.03.12 19:21) [6]
Ты про сжатие?
Pavia (2012-03-21 19:21:00) [6]
> Данные о изображении находятся сразу за TBitmapInfoHeader
Не всегда.
Rouse_ (2012-03-21 19:19:00) [7]Данные о изображении находятся сразу за TBitmapInfoHeader, поэтому смысла в использовании ScanLine, что для вертикали, что для горизонтали, нет...
icWasya (2012-03-21 09:39:00) [8]Кстати насчёт кэша.
Делалась некоторая обработка картинки (GrayScale), причём требовалось как раз проходить по вертикальным полосам. Проводились замеры времени обработки. И оказалось, что если картинка имеет ширину в 2048 байт, то времени затрачивается больше, чем когда имеет другую ширину, например 2040.
Pavia (2012-03-20 18:57:00) [9]Если алгоритм сложный, то [x,y] преобразовываю y*LineLength+x*PixelSize
У меня код оптимизирован массивами не использую пользуюсь указателями.
Для перехода к другой строки указатель увеличивается на длину строки в байтах Inc(PByte(p),LineLength).
Для определённых алгоритмов быстрее выполнить транспонирование картинке. Произвести преобразование по строкам и снова транспонировать. Это только для картинок которые в кэш L1 не влазят. Секрет в блочном транспонирование, оно более оптимально использует кэш чем прямой алгоритм. Сам пока код не делал.
Сергей М. (2012-03-20 17:26:00) [10]Ну если битмап сравнительно мал в объеме данных, то какая разница вертикально или горизонтально ?
Целиком прочитал ScanLine'ом в массив - и ходи себе по массиву как тебе удобно, хоть вертикально хоть конем)
Димка На (2012-03-20 17:14:00) [11]Что написал:)
преобразование битмапа, конечно. Ну или просто сканирование.