2013-02-24 2 views
3

Im пытается загрузить растровое изображение до определенного размера с помощью аллегро.Загрузка растрового изображения до определенного размера

al_crate_bitmap (x, y) - создает растровое изображение до определенного размера. al_load_bitmap (filename) - загружает изображение, которое мне нужно, но его первоначальный размер.

Мне нужно загрузить растровое изображение до размера, который я установил. Есть идеи?

Спасибо, Сонни

ответ

2

Ключ al_draw_scaled_bitmap(). Благодаря этому вы можете разбить любой растровый файл источника на целевую растровую карту любого нового размера. Поэтому вам не нужно создавать новый растровый рисунок. Вы всегда можете использовать эту функцию для рисования растрового изображения другого размера. Аллегро 5 аппаратно ускоряется, поэтому эти типы операций часто «бесплатны».

Чтобы получить ответ на вопрос:

ALLEGRO_BITMAP *load_bitmap_at_size(const char *filename, int w, int h) 
{ 
    ALLEGRO_BITMAP *resized_bmp, *loaded_bmp, *prev_target; 

    // 1. create a temporary bitmap of size we want 
    resized_bmp = al_create_bitmap(w, h); 
    if (!resized_bmp) return NULL; 

    // 2. load the bitmap at the original size 
    loaded_bmp = al_load_bitmap(filename); 
    if (!loaded_bmp) 
    { 
    al_destroy_bitmap(resized_bmp); 
    return NULL; 
    } 

    // 3. set the target bitmap to the resized bmp 
    prev_target = al_get_target_bitmap(); 
    al_set_target_bitmap(resized_bmp); 

    // 4. copy the loaded bitmap to the resized bmp 
    al_draw_scaled_bitmap(loaded_bmp, 
    0, 0,        // source origin 
    al_get_bitmap_width(loaded_bmp),  // source width 
    al_get_bitmap_height(loaded_bmp), // source height 
    0, 0,        // target origin 
    w, h,        // target dimensions 
    0         // flags 
); 

    // 5. restore the previous target and clean up 
    al_set_target_bitmap(prev_target); 
    al_destroy_loaded_bmp(loaded_bmp); 

    return resized_bmp;  
} 

Я комментировал основные шаги в коде. Имейте в виду, что Allegro 5 имеет неявную цель, которая обычно является обратным буфером дисплея. Однако, как видно из приведенного выше кода, вы можете настроить таргетинг на другие растровые изображения, если вам нужно сделать растровые изображения для растровых операций.

Альтернативный способ, перемещение целевой битовой карты за пределами функции:

void load_bitmap_onto_target(const char *filename) 
{ 
    ALLEGRO_BITMAP *loaded_bmp; 
    const int w = al_get_bitmap_width(al_get_target_bitmap()); 
    const int h = al_get_bitmap_height(al_get_target_bitmap()); 

    // 1. load the bitmap at the original size 
    loaded_bmp = al_load_bitmap(filename); 
    if (!loaded_bmp) return; 

    // 2. copy the loaded bitmap to the resized bmp 
    al_draw_scaled_bitmap(loaded_bmp, 
    0, 0,        // source origin 
    al_get_bitmap_width(loaded_bmp),  // source width 
    al_get_bitmap_height(loaded_bmp), // source height 
    0, 0,        // target origin 
    w, h,        // target dimensions 
    0         // flags 
); 

    // 3. cleanup 
    al_destroy_bitmap(loaded_bmp); 
} 

ALLEGRO_BITMAP *my_bmp = al_create_bitmap(1000,1000); 
al_set_target_bitmap(my_bmp); 
load_bitmap_onto_target("test.png"); 
// perhaps restore the target bitmap to the back buffer, or continue 
// to modify the my_bmp with more drawing operations. 
+0

Мэтью спасибо за это, именно то, что мне нужно. Хотя я немного смутился по части. prev_target = al_get_target_bitmap(); Я не понимаю, что делает pre_target? – codingNightmares

+0

Allegro имеет неявное целевое растровое изображение, которое устанавливается через al_set_target_bitmap(). Все будущие операции рисования будут сделаны для этого растрового изображения. Если эта функция не восстановила целевое растровое изображение, тогда вызывающий код может не понимать, что цель была изменена и может случайно продолжить рисование на растровом изображении. Обычно в A5 вы позаботились об этом до вызова функции, но я оставил ее внутри функции, чтобы ее можно было использовать как есть. – Matthew

+0

@codingNightmares, я добавил второй пример. Основная точка - это функция, обычно не имеющая побочных эффектов, таких как изменение целевого растрового изображения. Таким образом, во втором примере функция просто рисует текущую цель. Эта практика в целом лучше подходит для API A5. – Matthew

Смежные вопросы