图片缩放算法实现与应用

引用工具地址:http://www.codeproject.com/Articles/146/Two-Pass-Scaling-using-Filters

Unlike traditional scaling of images, where every n'th pixel is sampled and copied to the result image, this template provides much more accurate image scaling features.

It takes a buffer of RGB values (as COLORREFs) and creates another buffer with new dimensions. The input / output buffers are sequential pixels (not compressed) compatible with the format used in 24-bit DIBs.

The template is instantiated with a specific filter. The filter determines the quality of the output image. Different basic filters are supplied with this template and additional filters can be easily added.

Major features:

  • Provides professional quality image scaling.
  • Code is optimized for image quality, not speed.
  • Supports various image filters:
    • Box filter.
    • Bilinear filter.
    • Gaussian filter.
    • Hamming filter.
    • Blackman filter.
    • ...New filters can be easily added.
  • Supports both magnification and minification.
  • Does not force aspect ratio limitations. e.g. an image can be magnified horizontally and minified vertically.
  • Supports 24-bit images. With little change can support other image formats / depths.
  • Template based - no need for libraries, DLLs etc. No linkage problems.

How to use the scaling template:

Assuming you have a non-compressed true-color 24-bit DIB in memory (the bits array is pointed by m_pBits), where the original bitmap width is m_dwWidth and height is m_dwHeight.

Your code should look something like this:

  1. #include <2PassScale.h>
    ...
    void CMyDIB::ScaleTo (DWORD dwNewWidth, DWORD dwNewHeight)
    {
        C2PassScale <CBilinearFilter> ScaleEngine;
        COLORREF *pOldBitmap = m_pBits;
        m_pBits = ScaleEngine.AllocAndScale (   m_pBits,
                                                m_dwWidth,
                                                m_dwHeight,
                                                dwNewWidth,
                                                dwNewHeight
                                            );
        if (NULL == m_pBits)
        {
            //
            // Handle errors here
            //
        }
        m_dwWidth = dwNewWidth;
        m_dwHeight = dwNewHeight;
        delete pOldBitmap;
    }
    //
    // Alternatively, if you already have a pre-allocated destination buffer
    // in the new size you can call ScaleEngine.Scale (...) and give it that buffer
    //

    通过模板的方式,可以轻松比较各种图片缩放方法。

posted on 2013-09-17 15:54  地图爱好者  阅读(295)  评论(0)    收藏  举报

导航