Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[52.14.84.144] |
|
Сообщ.
#1
,
|
|
|
Почему при ипользовании ф-ции StretchBlt(...) ф-ция фигово сжимает картинку, т.е. плохо ее рисует при уменьшении!
Т.е. у меня есть картинки из оттенков серого (задний фон ACDSee v.4.0, может кто знает!?)(черного нет), а когда уменьшаю где-то до 85\% и меньше, то получается, что ни с того ни с сего часть точек черные, часть серые, .... Как можно исправить этот косяк! Или есть альтернативы уменьшения/увеличения картинки - подскажите! |
Сообщ.
#2
,
|
|
|
Есть такой фильтр, blur называется. Ты с легкостью найдешь его в журнале программист №1 или в инете.
|
Сообщ.
#3
,
|
|
|
Так ведь это уже размазывание получается!
Что, вы хотите сказать, что ACDSee тоже размазывает картинку при приближении??? Думую нет!? Да, может у них свои методы, тогда какие могут быть методы увеличения/уменьшения картинки??? Если кто не жадный, можите кинуть исходничок на SUnteXx@pisem.net! |
Сообщ.
#4
,
|
|
|
Насколько я помню те дни, когда досконально копал GDI, StretchBlt для скорости не экстраполирует соседние пиксели. Поясню на примере.
Есть 3 пикселя (допустим, в строку). В идеале, если они при уменьшении попадают в один, программа должна считать средний цвет. StretchBlt по-моему этого не делает. Потом, насколько я помню, эта функция вообще некорретно уменьшает изображения и искажает цвета. Либо бери DirectX, либо уменьшай в Фотошопе, либо пиши сам. Но можно изменить (или расшифровать?) идею HOMO_PROGRAMMATIS'а - блюрить картинку не после, а до уменьшения. Тогда и StretchBlt с экстраполяцией не наврет. Потом, проверь цветовой формат. Если не True Color, то забудь про StretchBlt. Если допустим у тебя пиксель был какой-нить почти черный, стал чуть потемнее, а такого цвета в палитре нет, а ближайший - черный - вот и получаешь. Так что смотри... P.S. Часом эта моя экстраполяция не интерполяцией называется? ;-) |
Сообщ.
#5
,
|
|
|
2Kosha! Приведите пример, плз! А то я еще не копался в GDI и не сильно силен в MVC++ и английском! Плз, F1!
З.Ы. Фотошоп не катит, т.к. картинки могут быть разные, каждый раз разная, а под DirectX'ом не работал, т.е. не знаю что к чему! З.Ы.Ы. Плз, сорсик кто-нить киньте! |
Сообщ.
#6
,
|
|
|
На www.codeguru.com было нечто этакое:
http://www.codeguru.com/bitmap/Fast2PassScale.html |
Сообщ.
#7
,
|
|
|
2migel: Я все понимаю, все это здорово, но мне не хотелось бы создавать новые биты картинки (а вдруг у меня картинка 8000х8000х32, а уменьшить надо в два раза - и что, будет у меня две гигантские картинки, которые хз сколько весят!), ведь StretchBlt новой картинки же не создает, а в сорсе, который вы мне дали, там создается новая картинка, а это, в данной ситуации, не покатит! Очень жаль!
Может самому можно сжать/растянуть картинку. Но как? Кто-нить может объяснит алгаритм этот или сорсик кинет (желательно в Win32Api без MFC, но и с MFC покатит!) Благодарен всем, кто помог и кто поможет! |
Сообщ.
#8
,
|
|
|
2SUnteXx: StretchBLT тоже новую картинку создает. Ну, не совсем она, но ведь она пишет на DC, в который выбран Bitmap, вот который-то и весит. Так что даже с ней ресурсы используются...
|
Сообщ.
#9
,
|
|
|
правильный ответ: SetStretchBltMode(canvas.handle,STRETCH_HALFTONE);
ps Я опоздал лет на 15, но темка то в гугл поиске вылезает между прочим |