Автор
|
Тема: Уменьшение картинки или StretchBlt(...)
|
SUnteXx |
опубликован 11-11-2001 19:40 MSK
Почему при ипользовании ф-ции StretchBlt(...) ф-ция фигово сжимает картинку, т.е. плохо ее рисует при уменьшении!Т.е. у меня есть картинки из оттенков серого (задний фон ACDSee v.4.0, может кто знает!?)(черного нет), а когда уменьшаю где-то до 85% и меньше, то получается, что ни с того ни с сего часть точек черные, часть серые, .... Как можно исправить этот косяк! Или есть альтернативы уменьшения/увеличения картинки - подскажите!
|
HOMO_PROGRAMMATIS
|
опубликован 11-11-2001 21:27 MSK
Есть такой фильтр, blur называется. Ты с легкостью найдешь его в журнале программист №1 или в инете. |
SUnteXx
|
опубликован 12-11-2001 00:31 MSK
Так ведь это уже размазывание получается! Что, вы хотите сказать, что ACDSee тоже размазывает картинку при приближении??? Думую нет!? Да, может у них свои методы, тогда какие могут быть методы увеличения/уменьшения картинки??? Если кто не жадный, можите кинуть исходничок на SUnteXx@pisem.net! |
Kosha
|
опубликован 12-11-2001 01:02 MSK
Насколько я помню те дни, когда досконально копал GDI, StretchBlt для скорости не экстраполирует соседние пиксели. Поясню на примере.Есть 3 пикселя (допустим, в строку). В идеале, если они при уменьшении попадают в один, программа должна считать средний цвет. StretchBlt по-моему этого не делает. Потом, насколько я помню, эта функция вообще некорретно уменьшает изображения и искажает цвета. Либо бери DirectX, либо уменьшай в Фотошопе, либо пиши сам. Но можно изменить (или расшифровать?) идею HOMO_PROGRAMMATIS'а - блюрить картинку не после, а до уменьшения. Тогда и StretchBlt с экстраполяцией не наврет. Потом, проверь цветовой формат. Если не True Color, то забудь про StretchBlt. Если допустим у тебя пиксель был какой-нить почти черный, стал чуть потемнее, а такого цвета в палитре нет, а ближайший - черный - вот и получаешь. Так что смотри... P.S. Часом эта моя экстраполяция не интерполяцией называется? ;-)
|
SUnteXx
|
опубликован 12-11-2001 13:37 MSK
2Kosha! Приведите пример, плз! А то я еще не копался в GDI и не сильно силен в MVC++ и английском! Плз, F1!З.Ы. Фотошоп не катит, т.к. картинки могут быть разные, каждый раз разная, а под DirectX'ом не работал, т.е. не знаю что к чему! З.Ы.Ы. Плз, сорсик кто-нить киньте! |
migel
|
опубликован 12-11-2001 13:51 MSK
На www.codeguru.com было нечто этакое: http://www.codeguru.com/bitmap/Fast2PassScale.html |
SUnteXx
|
опубликован 13-11-2001 00:19 MSK
2migel: Я все понимаю, все это здорово, но мне не хотелось бы создавать новые биты картинки (а вдруг у меня картинка 8000х8000х32, а уменьшить надо в два раза - и что, будет у меня две гигантские картинки, которые хз сколько весят!), ведь StretchBlt новой картинки же не создает, а в сорсе, который вы мне дали, там создается новая картинка, а это, в данной ситуации, не покатит! Очень жаль!Может самому можно сжать/растянуть картинку. Но как? Кто-нить может объяснит алгаритм этот или сорсик кинет (желательно в Win32Api без MFC, но и с MFC покатит!) Благодарен всем, кто помог и кто поможет! |
Kosha
|
опубликован 13-11-2001 00:39 MSK
2SUnteXx: StretchBLT тоже новую картинку создает. Ну, не совсем она, но ведь она пишет на DC, в который выбран Bitmap, вот который-то и весит. Так что даже с ней ресурсы используются... |