Memuat Gambar Selain Bitmap dengan SDL_Image

Untuk menampilkan gambar selain gambar dengan format BMP, kita akan butuh library tambahan. Kita butuh SDL_image untuk menampilkan gambar dengan format jpeg, png, dan beberapa format lain. SDL_image bisa kalian download di sini :
Untuk linux terutama ubuntu, kita bisa menginstallnya melalui terminal atau package manager. Jika menggunakan terminal di ubuntu, kita bisa menginstal SDL_Image 2 dengan mengetik :
  • sudo apt-get install libsdl2-image-dev

 

Pengaturan Linker

Setelah diinstal, kita harus mengubah pengaturan sesuai IDE yang kita gunakan supaya library bisa digunakan. Jika menggunakan codeblock, tambahkan -lSDL2_image pada tab link yang dalam "Build option". Jangan lupa untuk meletakkan dll atau runtime library di folder project yang kita buat jika OS-nya adalah window!

Untuk mengubah setting linker, kalian bisa klik menu "Project => Build Option". Opsi yang bisa kalian tambahkan ke Linker Setting adalah sebagai berikut.
  1. Linux => `sdl2-config --libs` -lSDL2 -lSDL2_image
  2. Windows => -lmingw32 -lSDL2main -lSDL2 -lSDL2_image

 

Cara Build atau Compile

Jika kalian menggunakan code block, kalian bisa melakukan build project dengan klik "tombol Build" atau menu "Build => Build". Untuk kalian yang hanya menggunakan mingw dengan g++ dan kelompoknya, kalian bisa meng-compile kode programnya dengan mengetik seperti di bawah ini dengan anggapan nama filenya adalah "kode_program.cpp". Nama tersebut bisa kalian ganti sesuai nama file kalian.
  • g++ kode_program.cpp `sdl2-config --libs` -lSDL2 -lSDL2_image -o nama_program

 

Menampilkan Gambar

Untuk contoh kode program yang akan saya bahas, saya akan menggunakan gambar berformat PNG. Selain PNG, kalian juga bisa menggunakan format  JPEG, TIFF, dan WEBP.
Berikut ini adalah contoh kode program yang menggunakan SDL_image. Kalau bisa, coba gunakan gambar PNG yang transparan supaya terasa bedanya dibandingkan dengan gambar bitmap biasa.
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>

int main( int argc, char* args[] ){
    SDL_Window* window = NULL;
    SDL_Event evt;

    SDL_Surface* screenSurface = NULL;

    if( SDL_Init( SDL_INIT_VIDEO ) < 0 && IMG_Init(IMG_INIT_JPG|IMG_INIT_PNG)){
        printf( "Error: %s\n", SDL_GetError() );
    }else{
        window = SDL_CreateWindow( "SDLku", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN );
        if( window == NULL ){
            printf( "Error : %s", SDL_GetError() );
        }else{
            screenSurface = SDL_GetWindowSurface( window );

            SDL_FillRect( screenSurface, NULL, SDL_MapRGB( screenSurface->format, 0xFF, 0xFF, 0xFF) );
            SDL_Surface *bmp=IMG_Load("gambar.png");
            if(bmp){
                SDL_Rect rct, rcd;
                if(bmp){
                    while(evt.type!=SDL_QUIT){
                        while(SDL_PollEvent(&evt)){
                            rct.x=bmp->w/2;
                            rct.y=0;
                            rct.w=bmp->w;
                            rct.h=bmp->h;

                            rcd.x=0;
                            rcd.y=0;
                            rcd.w=bmp->w*2;
                            rcd.h=bmp->h*2;
                            SDL_FillRect( screenSurface, NULL, SDL_MapRGB( screenSurface->format, 0xFF, 0xFF, 0xFF) );
                            SDL_BlitScaled(bmp, &rct, screenSurface, &rcd);
                            SDL_BlitSurface(bmp, &rct, screenSurface, &rcd);
                            SDL_UpdateWindowSurface( window );
                        }
                    }
                    SDL_FreeSurface(bmp);
                }
            }
        }
    }

    SDL_DestroyWindow( window );
    SDL_Quit();

    return 0;
}
Pada contoh di atas, kita memuat gambar berformat png dengan nama "gambar.png" dengan menggunakan function IMG_Load. IMG_Load mengembalikan surface yang berisi gambar jika function berhasil memuat gambar. Jika tidak berhasil, maka yang dikembalikan adalah 0 atau NULL.
  • SDL_Surface *IMG_Load(const char *nama_file) 
Sebelum kalian menggunakan function-function pada SDL_Image, kalian harus memanggil function IMG_Init dengan parameter sesuai format gambar yang digunakan. IMG_Init akan mengembalikan nilai selain -1 jika library SDL_Image siap digunakan.

Selain IMG_Load, kita juga menggunakan SDL_BlitSurface dan SDL_BlitScaled untuk menampilkan gambar yang sudah kita muat ke permukaan window. Kode program tersebut menggunakan SDL_Rect untuk memotong gambar yang akan ditampilkan. Ukuran gambar bisa kita dapatkan dari variabel dengan tipe SDL_Surface yang kita gunakan untuk menyimpan gambar yang sudah dimuat. Member w pada variabel dengan tipe SDL_Surface digunakan untuk mendapatkan lebar dari surface. Tinggi surface yang kita gunakan bisa kita dapatkan dari h.

Untuk hasil yang sesuai keinginan, sebaiknya jangan gunakan SDL_ConvertSurface jika gambar yang digunakan punya bagian transparan.

Menyimpan Gambar berformat PNG 

Kalian bisa menyimpan gambar berformat PNG dengan menggunakan IMG_SavePNG. Function ini hanya bisa menyimpan PNG dengan format 32 bit. Kalau kalian ingin menyimpan gambar ke format lain, kalian bisa menggunakan library lain seperti Free Image atau library lain yang sejenis.

Contoh kode programnya bisa kalian lihat di bawah ini.
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>

int main( int argc, char* args[] ){
    SDL_Window* window = NULL;
    SDL_Event evt;

    SDL_Surface* layar = NULL;

    if( SDL_Init( SDL_INIT_VIDEO ) < 0 && IMG_Init(IMG_INIT_JPG|IMG_INIT_PNG)){
        printf( "Error: %s\n", SDL_GetError() );
    }else{
        window = SDL_CreateWindow( "SDLku", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN );
        if( window == NULL ){
            printf( "Error : %s", SDL_GetError() );
        }else{
            layar = SDL_GetWindowSurface( window );

            SDL_FillRect( layar, NULL, SDL_MapRGB( layar->format, 0xFF, 0xFF, 0xFF) );
            SDL_Surface *bmp=IMG_Load("gambar.png");
            if(bmp){
                SDL_Rect rct, rcd;
                if(bmp){
                    while(evt.type!=SDL_QUIT){
                        while(SDL_PollEvent(&evt)){
                            rct.x=bmp->w/2;
                            rct.y=0;
                            rct.w=bmp->w;
                            rct.h=bmp->h;

                            rcd.x=0;
                            rcd.y=0;
                            rcd.w=bmp->w*2;
                            rcd.h=bmp->h*2;
                            SDL_FillRect( layar, NULL, SDL_MapRGB( layar->format, 0xFF, 0xFF, 0xFF) );
                            SDL_BlitScaled(bmp, &rct, layar, &rcd);
                            SDL_BlitSurface(bmp, &rct, layar, &rcd);
                            SDL_UpdateWindowSurface( window );
                        }
                    }
                    IMG_SavePNG(layar, "Codelogi.png");
                    SDL_FreeSurface(bmp);
                }
            }
        }
    }

    SDL_DestroyWindow( window );
    SDL_Quit();

    return 0;
}
Seperti biasa, untuk yang malas mengetik, kalian bisa download kode program beserta project-nya di sini.