Click here to Skip to main content
Click here to Skip to main content

Two Pass Scaling using Filters

By , 11 Dec 1999
 
  • 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

    About the Author

    Eran Yariv
    United States United States
    Member
    No Biography provided

    Sign Up to vote   Poor Excellent
    Add a reason or comment to your vote: x
    Votes of 3 or less require a comment

    Comments and Discussions

     
    Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
    You must Sign In to use this message board.
    Search this forum  
        Spacing  Noise  Layout  Per page   
    Question16-bit version?memberkennygoers8 Feb '07 - 5:13 
    GeneralSo close to what I neededmemberwaldermort11 Sep '06 - 8:54 
    GeneralRe: So close to what I neededmemberTeashirt213 Sep '07 - 5:52 
    GeneralRe: So close to what I neededmemberWalderMort13 Sep '07 - 6:01 
    Generalinteger division of 1 by 2memberKummerSurfer26 Feb '06 - 7:53 
    GeneralHere is HUGE speed improvementmemberJake Montgomery17 Jan '05 - 11:48 
    GeneralRe: Here is HUGE speed improvementmemberArlen Albert16 Mar '05 - 16:24 
    GeneralRe: Here is HUGE speed improvementmemberJake Montgomery17 Mar '05 - 8:04 
    GeneralRe: Here is HUGE speed improvementmemberArlen Albert18 Mar '05 - 4:14 
    GeneralRe: Here is HUGE speed improvementmemberGautam Jain13 May '06 - 7:34 
    GeneralRe: Here is HUGE speed improvementmemberJake Montgomery10 Jul '06 - 9:20 
    GeneralRe: Here is HUGE speed improvementmembera.mulay5 Oct '06 - 2:38 
    GeneralRe: Here is HUGE speed improvementmemberDKScherpy6 Nov '06 - 7:19 
    GeneralRe: Here is HUGE speed improvementmembera.mulay7 Nov '06 - 0:44 
    GeneralBugs for 24 bit.memberguju4 May '11 - 3:43 
    Questionwhere is my mistake?member鄂人6 Dec '04 - 13:55 
    Questiondo u send theory of those filters to me?memberZita7 Jan '04 - 16:14 
    GeneralAwesome!!memberWREY18 Nov '03 - 19:47 
    QuestionAlgorithm?memberCohen17 Jan '03 - 1:04 
    AnswerRe: Algorithm?memberGuy Bonneau18 Feb '04 - 3:24 
    GeneralRe: Algorithm?memberGuy Bonneau18 Feb '04 - 11:20 
    There is also more theoritical information available at this link:
     
    http://www.dspguide.com/ch16.htm
    QuestionFaster but less "accurate" version?memberJeremy Davis18 Apr '02 - 0:24 
    AnswerRe: Faster but less &quot;accurate&quot; version?memberpeterchen29 Nov '03 - 22:51 
    QuestionHow to use scailing with grayscale bitmapmemberSun Satis21 Jan '02 - 19:44 
    Questionsample code???memberobjects30 Mar '01 - 15:54 

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

    Permalink | Advertise | Privacy | Mobile
    Web02 | 2.6.130516.1 | Last Updated 12 Dec 1999
    Article Copyright 1999 by Eran Yariv
    Everything else Copyright © CodeProject, 1999-2013
    Terms of Use
    Layout: fixed | fluid