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.
Untuk mengubah setting linker, kalian bisa klik menu "Project => Build Option". Opsi yang bisa kalian tambahkan ke Linker Setting adalah sebagai berikut.
- Linux => `sdl2-config --libs` -lSDL2 -lSDL2_image
- Windows => -lmingw32 -lSDL2main -lSDL2 -lSDL2_image
Cara Build atau Compile
- 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.
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.
- SDL_Surface *IMG_Load(const char *nama_file)
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;
}