Click here to Skip to main content
15,867,308 members
Articles / Desktop Programming / MFC
Article

Two Pass Scaling using Filters

Rate me:
Please Sign up or sign in to vote.
4.94/5 (23 votes)
11 Dec 1999 571.8K   2.8K   64   28
A smart way of scaling bitmaps
  • Download source files - 4 Kb

    Sample Image - 2_pass_scaling.jpg

    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
  • License

    This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

    A list of licenses authors might use can be found here


    Written By
    United States United States
    This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

    Comments and Discussions

     
    Question16-bit version? Pin
    kennygoers8-Feb-07 5:13
    kennygoers8-Feb-07 5:13 
    GeneralSo close to what I needed Pin
    Waldermort11-Sep-06 8:54
    Waldermort11-Sep-06 8:54 
    GeneralRe: So close to what I needed Pin
    Teashirt213-Sep-07 5:52
    Teashirt213-Sep-07 5:52 
    GeneralRe: So close to what I needed Pin
    Waldermort13-Sep-07 6:01
    Waldermort13-Sep-07 6:01 
    Generalinteger division of 1 by 2 Pin
    KummerSurfer26-Feb-06 7:53
    KummerSurfer26-Feb-06 7:53 
    GeneralHere is HUGE speed improvement Pin
    Jake Montgomery17-Jan-05 11:48
    Jake Montgomery17-Jan-05 11:48 
    GeneralRe: Here is HUGE speed improvement Pin
    Arlen Albert16-Mar-05 16:24
    Arlen Albert16-Mar-05 16:24 
    GeneralRe: Here is HUGE speed improvement Pin
    Jake Montgomery17-Mar-05 8:04
    Jake Montgomery17-Mar-05 8:04 
    I have fixed the original post.
    The only item you need from macros.h is

    #define BOUND(x,a,b) \
    (((x) <= (a)) ? (a) : (((x) > (b)) ? (b) : (x)))
    GeneralRe: Here is HUGE speed improvement Pin
    Arlen Albert18-Mar-05 4:14
    Arlen Albert18-Mar-05 4:14 
    GeneralRe: Here is HUGE speed improvement Pin
    Gautam Jain13-May-06 7:34
    Gautam Jain13-May-06 7:34 
    GeneralRe: Here is HUGE speed improvement Pin
    Jake Montgomery10-Jul-06 9:20
    Jake Montgomery10-Jul-06 9:20 
    GeneralRe: Here is HUGE speed improvement Pin
    a.mulay5-Oct-06 2:38
    a.mulay5-Oct-06 2:38 
    GeneralRe: Here is HUGE speed improvement Pin
    DKScherpy6-Nov-06 7:19
    DKScherpy6-Nov-06 7:19 
    GeneralRe: Here is HUGE speed improvement Pin
    a.mulay7-Nov-06 0:44
    a.mulay7-Nov-06 0:44 
    GeneralBugs for 24 bit. Pin
    guju4-May-11 3:43
    guju4-May-11 3:43 
    Questionwhere is my mistake? Pin
    廖楚江6-Dec-04 13:55
    廖楚江6-Dec-04 13:55 
    Questiondo u send theory of those filters to me? Pin
    Member 3084827-Jan-04 16:14
    Member 3084827-Jan-04 16:14 
    GeneralAwesome!! Pin
    WREY18-Nov-03 19:47
    WREY18-Nov-03 19:47 
    QuestionAlgorithm? Pin
    ylzhao17-Jan-03 1:04
    ylzhao17-Jan-03 1:04 
    AnswerRe: Algorithm? Pin
    Guy Bonneau18-Feb-04 3:24
    Guy Bonneau18-Feb-04 3:24 
    GeneralRe: Algorithm? Pin
    Guy Bonneau18-Feb-04 11:20
    Guy Bonneau18-Feb-04 11:20 
    QuestionFaster but less "accurate" version? Pin
    jerry0davis18-Apr-02 0:24
    jerry0davis18-Apr-02 0:24 
    AnswerRe: Faster but less &quot;accurate&quot; version? Pin
    peterchen29-Nov-03 22:51
    peterchen29-Nov-03 22:51 
    QuestionHow to use scailing with grayscale bitmap Pin
    21-Jan-02 19:44
    suss21-Jan-02 19:44 
    Questionsample code??? Pin
    30-Mar-01 15:54
    suss30-Mar-01 15:54 

    General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

    Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.