Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2015.09.10;
Скачать: CL | DM;

Вниз

Вертикальный TBitmap.ScanLine   Найти похожие ветки 

 
Димка На   (2012-03-20 17:13) [0]

Как вы поступаете, когда требуется вертикальное преобразование строки?


 
Димка На   (2012-03-20 17:14) [1]

Что написал:)
преобразование битмапа, конечно. Ну или просто сканирование.


 
Сергей М. ©   (2012-03-20 17:26) [2]

Ну если битмап сравнительно мал в объеме данных, то какая разница вертикально или горизонтально ?

Целиком прочитал ScanLine"ом в массив - и ходи себе по массиву как тебе удобно, хоть вертикально хоть конем)


 
Pavia ©   (2012-03-20 18:57) [3]

Если алгоритм сложный, то [x,y] преобразовываю y*LineLength+x*PixelSize

У меня код оптимизирован массивами не использую пользуюсь указателями.
Для перехода к другой строки указатель увеличивается на длину строки в байтах Inc(PByte(p),LineLength).

Для определённых алгоритмов быстрее выполнить транспонирование картинке. Произвести преобразование по строкам и снова транспонировать. Это только для картинок которые в кэш L1 не влазят. Секрет в блочном транспонирование, оно более оптимально использует кэш чем прямой алгоритм. Сам пока код не делал.


 
icWasya ©   (2012-03-21 09:39) [4]

Кстати насчёт кэша.
Делалась некоторая обработка картинки (GrayScale), причём требовалось как раз проходить по вертикальным полосам. Проводились замеры времени обработки. И оказалось, что если картинка имеет ширину в 2048 байт, то времени затрачивается больше, чем когда имеет другую ширину, например 2040.


 
Rouse_ ©   (2012-03-21 19:19) [5]

Данные о изображении находятся сразу за TBitmapInfoHeader, поэтому смысла в использовании ScanLine, что для вертикали, что для горизонтали, нет...


 
Pavia ©   (2012-03-21 19:21) [6]


> Данные о изображении находятся сразу за TBitmapInfoHeader

Не всегда.


 
Rouse_ ©   (2012-03-21 19:26) [7]


> Pavia ©   (21.03.12 19:21) [6]

Ты про сжатие?


 
Pavia ©   (2012-03-21 19:37) [8]

Я про CreateDIBSection.


 
Rouse_ ©   (2012-03-21 22:20) [9]


> Pavia ©   (21.03.12 19:37) [8]
>
> Я про CreateDIBSection.
>

Эмм, я конечно давно с растром не работал, могу и ошибиться, но в чем нюанс? куда данные то денутся??


 
han_malign   (2012-03-22 11:16) [10]


> куда данные то денутся?

- это т.н. 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-22 11:27) [11]

Ну так я про нюансы по поводу сжатия и спрашивал :) Это-то я в курсе :)



Страницы: 1 вся ветка

Текущий архив: 2015.09.10;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.046 c
15-1418419802
Юрий
2014-12-13 00:30
2015.09.10
С днем рождения ! 13 декабря 2014 суббота


2-1395389749
Вова
2014-03-21 12:15
2015.09.10
Не работает компонент


15-1417013096
ВладОшин
2014-11-26 17:44
2015.09.10
Самое время покупать кондиционер, прошу совета


15-1414158286
Дмитрий С
2014-10-24 17:44
2015.09.10
Удаление SpeedChecker


15-1415309409
Юрий
2014-11-07 00:30
2015.09.10
С днем рождения ! 7 ноября 2014 пятница