John
John

Reputation: 117

SDL Image scale

I'm using the sdl library, but it dosent support scale / resize surface, so i downloaded the

SDL_image 1.2 & SDL_gfx Library. My function/code works, but the image appear in bad / low

quality.

Let say i got a image which is 100X100, if i scale down to 95X95 or scale up to 110X110 the

quality appear very low, but if i leave it at 100X100 which is the same size it appear in

good quality. Images most appear in good quality, if scaled down, but ... it dosent

my code is:

int drawImage(SDL_Surface* display, const char * filename, int x, int y, int xx, int yy , const double newwidth, const double newheight, int transparent = NULL)
{



    SDL_Surface *image;
    SDL_Surface *temp;
    temp = IMG_Load(filename); if (temp == NULL) { printf("Unable to load image: %s\n", SDL_GetError()); return 1; }
    image = SDL_DisplayFormat(temp); SDL_FreeSurface(temp);

        // Zoom function uses doubles for rates of scaling, rather than
    // exact size values. This is how we get around that:
    double zoomx = newwidth  / (float)image->w;
    double zoomy = newheight / (float)image->h;

    // This function assumes no smoothing, so that any colorkeys wont bleed.
    SDL_Surface* sized = zoomSurface( image, zoomx, zoomy, SMOOTHING_OFF );



    // If the original had an alpha color key, give it to the new one.
    if( image->flags & SDL_SRCCOLORKEY )
    {
        // Acquire the original Key
        Uint32 colorkey = image->format->colorkey;

        // Set to the new image
        SDL_SetColorKey( sized, SDL_SRCCOLORKEY, colorkey );
    }



    // The original picture is no longer needed.
    SDL_FreeSurface( image );

    // Set it instead to the new image.
    image =  sized;



    SDL_Rect src, dest;
    src.x = xx; src.y = yy; src.w = image->w; src.h = image->h; // size 
    dest.x =  x; dest.y = y; dest.w = image->w; dest.h = image->h;

    if(transparent == true )
     {

         //Set the color as transparent
         SDL_SetColorKey(image,SDL_SRCCOLORKEY|SDL_RLEACCEL,SDL_MapRGB(image->format,0x0,0x0,0x0)); 

     }

    else {

    }


    SDL_BlitSurface(image, &src, display, &dest);

    return true;
}

drawImage(display, "Image.png", 50, 100, NULL, NULL, 100, 100,true);

Upvotes: 1

Views: 5017

Answers (1)

Steve C
Steve C

Reputation: 647

An image that is scaled without allowing smoothing is going to have artifacts. You might have better luck if you start with SVG and render it at the scale that you want. Here's an SVG -> SDL surface library.

Upvotes: 2

Related Questions