2 Pass Scaling using Filters

Scaling sample:

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:


#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
//

Download source - 3.5 KB



Comments

Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Java developers know that testing code changes can be a huge pain, and waiting for an application to redeploy after a code fix can take an eternity. Wouldn't it be great if you could see your code changes immediately, fine-tune, debug, explore and deploy code without waiting for ages? In this white paper, find out how that's possible with a Java plugin that drastically changes the way you develop, test and run Java applications. Discover the advantages of this plugin, and the changes you can expect to see …

  • Corporate e-Learning technology has a long and diverse pedigree. As far back as the 1980s, companies were adopting computer-based training to supplement traditional classroom activities. More recently, rich web-based applications have added streaming audio and video, real-time collaboration and other new tools to the e-Learning mix. At the same time, the growing availability of informal learning tools--a category that includes everything from web searches to social media posts--are having a major impact on …

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds