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

                    ps Я опоздал лет на 15, но темка то в гугл поиске вылезает между прочим
                    Сообщение отредактировано: мыш -
                    1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0221 ]   [ 15 queries used ]   [ Generated: 20.05.24, 16:53 GMT ]