ресайзинг быстрее чем StretchBlt

Тема в разделе "WASM.WIN32", создана пользователем slow, 6 апр 2006.

  1. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    собс-но сабж.



    как сделать ресайзинг изображения быстрее чем StretchBlt?

    сейчас делаю так:



    IntPtr surfaceDC = e.Graphics.GetHdc();



    IntPtr memDC = CreateCompatibleDC(surfaceDC);

    IntPtr hBmp = bm.GetHbitmap();



    При достаточно большом уменьшении stretchblt выполняется недостаточно быстро.

    IntPtr hPrevBmp = SelectObject(memDC, hBmp);



    StretchBlt(surfaceDC, PaintRect.X, PaintRect.Y, PaintRect.Width, PaintRect.Height,

    memDC, 0, 0, BitmapRect.Width, BitmapRect.Height, (int)TernaryRasterOperations.SRCCOPY);



    SelectObject(memDC, hPrevBmp);

    DeleteObject(hBmp);

    DeleteDC(memDC);



    e.Graphics.ReleaseHdc(surfaceDC);
     
  2. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    скорость можно повысить в обмен на некоторое ухудшение качества, установив StretchMode в COLORONCOLOR
     
  3. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Это-то я поставил уже, все равно медленно :-((
     
  4. HitmaN85

    HitmaN85 New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2005
    Сообщения:
    36
    Ресайзинг вообще не очень быстрая операция. Ускорить можно только если сам будешь преобразовывать изображение.



    Какие размеры картинки? Какая скорость нужна?
     
  5. Kola

    Kola New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2004
    Сообщения:
    69
    выход один - получать диб, пиксели, ресайзить руками (например брезенхемом) и делать потом BitBlt
     
  6. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    размеры картинки ~10000*10000 пикселей

    показывается ессно только то что влазит на экран

    а скорость - надо чтобы летало :)



    Kola

    ткните, пож, носом в ссылку какую-нить по этому поводу
     
  7. Kola

    Kola New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2004
    Сообщения:
    69
    slow

    извините, ссылку не могу дать тк просто не знаю такой :dntknw:

    я это делал сам, читая только MSDN.

    К сожалению сорсов сейчас под рукой нет.

    Вкратце последовательность такая:

    Вызываем GetDIBits, делаем Stretch (я функцию их использовал Intel-овской IPP), из полученных пикселей создаем bitmap, селектим ее в memDC, потом BitBlt её в экран
     
  8. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Все кроме stretch'a не вызывает интереса :)



    ОК, спасибо за советы
     
  9. Noble Ghost

    Noble Ghost New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2004
    Сообщения:
    204
    Адрес:
    Russia


    выделяешь в изображении отображаемую область и применяешь зум исключительно для нее.
     
  10. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    slow



    GDI не позволяет вообще работать с такими большими картинками. Для этого существуют библиотеки сторонних производителей. Я бы для таких мега-картинок задействовал JPEG2000. Правда, нормальных и бесплатных либ для JPEG2000 пока ещё нет.
     
  11. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Noble Ghost

    так и делаем, все равно медленно :-( код наверно неоптимальный