درس 5: Color Keying

فایل های استفاده شده :

source code

adamak

‌background

درس 5: Color Keying (حذف کردن رنگهای مشخص در هنگام چسباندن)

 

ساختار SDL_Surface دارای عضوی به نام color key است

Color key رنگ مشخصی است که ما در هنگام چسباندن نمی خواهیم حضور یابد

 فرض کنید می خواهید این ادمک را به

این پس زمینه بچسبانید

ولی شما نمی خواهید اون رنگ ابی کم رنگ مزاحمتان شود

برای اینکار شما می توانید این رنگ ابی را به عنوان color key معرفی کنید

 

یک مقدمه در مورد رنگها :

همه رنگها از سه رنگ اصلی قرمزوسبزو آبی تشکیل شده اند (Red Green Blue)[RGB]  

هر رنگ از یک بایت تشکیل شده است پس جمعا 256*256*256 رنگ با این مدل می توان ساخت

یعنی : 16777216 رنگ می توان با این مدل ساخت.

مثلا رنگ 0 , 0 , 0 معرف رنگ سیاه است یعنی هیچ رنگی از هیچ کدام موجود نیست

یا رنگ 255,0,0 معرف قرمز مطلق

یا رنگ 0,255,0 معرف سبز مطلق

یا رنگ 0,0,255 معرف ابی مطلق

یا رنگ 255,255,255 معرف سفید

و رنگ 0,255,255 معرف همین ابی کم رنگ است

شما در مبنای HEX یعنی مبنی 16 هم می توانید بنویسید اعداد پایه HEX شامل :

1 2 3 4 5 6 7 8 9 A B C D E F

هست (ماشین حساب ویندوز یا لینوکس را ببینبد)

این رنگ ابی 0,0,FF است

 

معمولا color key را در هنگام بارگزاری فایل ست می کنند

SDL_Surface *load_image( std::string filename )

{

    //The image that's loaded

    SDL_Surface* loadedImage = NULL;

   

    //The optimized image that will be used

    SDL_Surface* optimizedImage = NULL;

   

    //Load the image

    loadedImage = IMG_Load( filename.c_str() );

   

    //If the image loaded

    if( loadedImage != NULL )

    {

        //Create an optimized image

        optimizedImage = SDL_DisplayFormat( loadedImage );

       

        //Free the old image

        SDL_FreeSurface( loadedImage );

این همان تابع image_load است که ما می خواهیم تغییر دهیم

        //If the image was optimized just fine

        if( optimizedImage != NULL )

        {

            //Map the color key

            Uint32 colorkey = SDL_MapRGB( optimizedImage->format, 0, 0xFF, 0xFF );

حالا هر می خواهیم color key را مشخص کنیم

تابع SDL_MapRGB 4 پارامتر می گیرد و رنگ مورد نظر را بر می گرداند پارامتر اول فرمت رنگ مثلا 32 bit که ما اینجا از فرمت optimizedImage استفاده می کنیم و سپس سه رنگ را می دهیم

            //Set all pixels of color R 0, G 0xFF, B 0xFF to be transparent

            SDL_SetColorKey( optimizedImage, SDL_RLEACCEL | SDL_SRCCOLORKEY, colorkey );

        }

حالا وقت انجام Color keying  است SDL_SetColorKey سه پارامتر می گیرد سطح مورد نظر . تنظیمات و رنگ

    //Return the optimized image

    return optimizedImage;

}

سر اخر optimizeImage  دستکاری شده را به ما می دهد

    //Apply the surfaces to the screen

    apply_surface( 0, 0, background, screen );

    apply_surface( 240, 190, foo, screen );

   

    //Update the screen

    if( SDL_Flip( screen ) == -1 )

    {

        return 1;   

    }

حال شکل مورد نظر به صورت زیر است

نظرات 0 + ارسال نظر
برای نمایش آواتار خود در این وبلاگ در سایت Gravatar.com ثبت نام کنید. (راهنما)
ایمیل شما بعد از ثبت نمایش داده نخواهد شد