Команды растрового изображения Allegro возвращают черный экран

Я новичок в allegro и c++. Я пытаюсь использовать растровые команды. Я использовал эту простую программу, чтобы проверить это:

#include <allegro.h>
BITMAP *red;
int main(){ 
    allegro_init();
    install_keyboard();
    set_color_depth(32);
    set_gfx_mode( GFX_AUTODETECT, 640, 480, 0, 0);  
    red = load_bitmap( "frago.png", NULL);      
    acquire_screen();
    blit(red, screen, 0, 0, 0, 0, 480, 360);
    release_screen();
    readkey();
    destroy_bitmap(red);
    return 0;    
}   
END_OF_MAIN();

Рассматриваемый файл «frago.png» находится на моем рабочем столе и представляет собой большой красный прямоугольник. Цвет поддерживается при глубине цвета 32. Я использую Xcode 4 на Mac. Кто-нибудь может мне помочь?


person Gabe    schedule 15.04.2011    source источник


Ответы (2)


Библиотека Allegro по умолчанию не может читать файлы .png. Вы должны использовать некоторые другие библиотеки/аддоны (libpng, zlib, loadpng). loadpng идет в комплекте с Allegro начиная с версии 4.3.10, но в компиляторе должны быть установлены libpng и zlib.

Вы должны использовать register_png_file_type() перед load_bitmap().

Аддон loadpng для Allegro 4.4 включен в его исходный код: https://alleg.svn.sourceforge.net/svnroot/alleg/allegro/branches/4.4/addons/loadpng/

Если PNG представляет собой изображение 8bpp, не забудьте загрузить его цветовую палитру:

PALETTE palette;
BITMAP* red = load_bitmap("frago.png", palette);
select_palette(palette);
blit(red, screen, 0, 0, 0, 0, red->w, red->h);
unselect_palette();

В любом случае, я думаю, что Allegro должен автоматически преобразовать ваше изображение в 32bpp, попробуйте использовать set_color_conversion перед load_bitmap() на всякий случай:

set_color_conversion(COLORCONV_TOTAL);

Наконец, вы можете попробовать использовать функцию load_png() напрямую (замените load_bitmap на load_png).

person dacap    schedule 15.04.2011
comment
register_png_file_type() не является командой allegro, и у меня есть libpng, zlib и loadpng. Я также пробовал .jpg и .bmp. - person Gabe; 16.04.2011
comment
register_png_file_type() — это функция, определенная в loadpng.h, вы должны #include загрузить файл loadpng.h. См. alleg.svn.sourceforge.net /svnroot/alleg/allegro/branches/4.4/ Также вы можете напрямую использовать load_png() (вместо register_png_file_type и load_bitmap). - person dacap; 16.04.2011
comment
Формат jpg не поддерживается Allegro без надстройки jpgalleg. Вы связываете свой исполняемый файл с этими надстройками? (loadpng, jpgalleg и т. д.) Или вы просто связываетесь с библиотекой allegro? (например, только флаг -lalleg). - person dacap; 16.04.2011
comment
Как связать с loadpng, libpng и zlib? - person Gabe; 17.04.2011
comment
Это другая тема, возможно, эти ответы помогут вам: stackoverflow.com/questions/5684373/ stackoverflow.com/questions/1300339/libpng-framework-on-os-x stackoverflow.com/questions/2117620/ - person dacap; 17.04.2011
comment
Эм... не могли бы вы просто сказать мне? :/ - person Gabe; 18.04.2011
comment
Нет, потому что я никогда не использовал Xcode. Я просто могу сказать вам, что аргументы командной строки для gcc могут быть чем-то вроде -lalleg -lpng -lzlib -lloadpng (но я не знаю, используете ли вы libpng в качестве фреймворка, динамическую библиотеку или статическую). Теперь у вас другая проблема, поэтому я думаю, что если вы зададите другой вопрос, например, как связать/скомпилировать программу с libpng/zlib в MacOS X? вы получите больше помощи. - person dacap; 18.04.2011
comment
Ну, может быть, PNG - это 8-битное изображение. Я отредактирую ответ, чтобы дать вам пример загрузки 8-битного изображения. - person dacap; 19.04.2011
comment
@dacap И, кстати, это 1-битное изображение. Я изменил его с красного на белый, потому что думал, что это поможет. - person Gabe; 20.04.2011
comment
Вы тестируете разные png-файлы? Вы пытаетесь использовать файл .bmp? Можете ли вы поделиться точным кодом и изображением, которое вы используете? Я хотел бы скомпилировать его вручную. - person dacap; 20.04.2011
comment
вот программа: | >#include <allegro.h> >#include <loadpng.h> >#include <zlib.h> >#include <png.h> >BITMAP *red; >int main(int argc, char *argv[]){ >allegro_init(); >install_keyboard(); >set_color_depth(32); >set_gfx_mode( GFX_AUTODETECT, 640, 480, 0, 0); >loadpng_init(); >PALETTE palette; (ПРОДОЛЖЕНИЕ) - person Gabe; 20.04.2011
comment
set_color_conversion(COLORCONV_TOTAL); red = load_png("frago.png", palette); select_palette(palette); if (red == NULL) { printf("The image could not be loaded.\n"); return 1; } acquire_screen(); select_palette(palette); blit(red, screen, 0, 0, 0, 0, red->w, red->h); printf("The image was loaded!"); release_screen(); readkey(); destroy_bitmap(red); return 0; } END_OF_MAIN(); Я использую белый прямоугольник размером 454x340 (FFFFFF). Я пробовал bmp, но это не сработало. Я собираюсь попробовать еще раз. И извините за код - person Gabe; 20.04.2011
comment
Здесь работает (с .bmp, Allegro 4.4). Попробуйте выполнить пример exbitmap Allegro, загружая ваш bmp, например. exbitmap frago.bmp (используйте bmp, а не png). Примеры exbitmap делают то же самое, что и ваш код, но проверяют каждую функцию. Несколько вопросов, вы компилировали Allegro? Какую именно версию вы используете? - person dacap; 21.04.2011
comment
Я использую Allegro 5.0 (.1?). Я связался с Аллегро. Это не первая моя программа с Allegro; другие работали, и я сделал то же самое для обоих (архитектура: 32-битный Intel, другие флаги компоновщика: -framework Cocoa -lalleg -lalleg-main -lpng -zlib -lloadpng, пути поиска заголовков: /opt/local/include, библиотека пути поиска: /opt/local/lib). И как мне реализовать exbitmap здесь? - person Gabe; 21.04.2011
comment
Аллегро 5.0? Но используемый вами API взят из Allegro 4. См. пример ex_bitmap для Allegro 5 (который полностью отличается от exbitmap Allegro 4) и прочитайте Документация по Allegro 5. API полностью изменился, и я думаю, вам следует связать свою программу с параметрами -lallegro и -llegro_main. - person dacap; 21.04.2011
comment
Да! Когда я изменил его на allegro вместо alleg, это сработало! Спасибо. - person Gabe; 22.04.2011
comment
Во всяком случае, я все еще не понимаю. Если вы используете Allegro 5, почему вы используете Allegro 4 API? Это невозможно! Если вы включаете ‹allegro.h›, это означает, что вы должны ссылаться на Allegro 4, а не 5. Если вы смогли скомпилировать другие программы, как вы сказали, вы должны использовать те же флаги компилятора/компоновщика здесь ( +дополнения). Я рекомендую вам задать этот вопрос на форумах Allegro и, пожалуйста, предоставьте им гораздо больше информации (конкретная версия Allegro, версии ОС и компилятора, как вы его компилируете и как вы связываете, если вы смогли скомпилировать примеры и как вы составить их и др.). - person dacap; 01.05.2011
comment
Я попробую, но какой API (.h) для allegro 5? - person Gabe; 05.05.2011
comment
Я не мог скомпилировать примеры; компилятору не удалось найти allegro/allegro5.h, allegro/allegro_image.h или common.c. Это должно быть проблема с API. - person Gabe; 08.05.2011
comment
Вы еще не скомпилировали Allegro 5. Начните скачивать последнюю версию Allegro 5, следуйте инструкциям README_macosx.txt. Вам потребуется установить cmake, потому что это система сборки, используемая Allegro 5. Затем вам следует прочитать эту страницу. Удачи, и вы даже не пытаетесь скомпилировать свои собственные программы, пока не сможете скомпилировать всю библиотеку + примеры, используя шаги README. - person dacap; 08.05.2011

Если программа не запущена в той же папке, что и образ, она не найдет образ.

Например, если программа запущена в c:\temp\MyProgram\, образ должен находиться в этой же папке.

Также некоторые IDE позволяют указать папку, в которую будет запускаться программа при запуске или отладке из IDE, вы можете указать этот путь на свой рабочий стол или скопировать образ в папку с программой.

Другой вариант — указать полный путь к изображению в вызове load_bitmap, но это, на мой взгляд, худшее решение, потому что программа будет работать только тогда, когда изображение находится именно в этом месте.

Также предлагаю добавить проверку на null:

red = load_bitmap("frago.png", NULL);
if(red == NULL)
{
    printf("Cannot load frago.png\n");
    return 0;
}
person bcsanches    schedule 15.04.2011
comment
Я попытался использовать ваше первое предложение и проверку на нуль. Проверка на нуль работает и вылетает из программы, но загрузить изображение все равно не может! - person Gabe; 15.04.2011
comment
Проверьте папку выполнения программы, как я прокомментировал, и проверьте ответ dacap о поддержке png. - person bcsanches; 15.04.2011
comment
Я помещаю файл в папку выполнения. - person Gabe; 16.04.2011
comment
Вы загрузили надстройку для изображений png? - person bcsanches; 20.04.2011
comment
Взгляните на ответ @dacap, он объясняет о надстройке для добавления поддержки изображений png в аллегро, добавили ли вы код надстройки в свой проект? - person bcsanches; 21.04.2011
comment
Чтобы я мог вам помочь, мне нужно, чтобы вы ответили мне, загрузили ли вы надстройку png для аллегро или нет. - person bcsanches; 01.05.2011
comment
@bcsanches Я загрузил loadpng, zlib и libpng. - person Gabe; 05.05.2011
comment
Вы на ошибки проверяли? Во время этого процесса не было ошибок? В худшем случае я бы посоветовал вам взять исходный код и отладить его там, где он точно не работает. Но я думаю о возможностях: 1 - загрузка аддона png не удалась из-за того, что файл не найден, 2 - загрузка файла не удалась, потому что файл не был найден, 3 - файл каким-то образом поврежден, и загрузка не удалась. - person bcsanches; 05.05.2011
comment
@bsanches что ты предлагаешь мне сделать? - person Gabe; 08.05.2011
comment
Вы проверили на ошибки, как я сказал? ЕСЛИ вы считаете, что все сделали правильно, я предлагаю вам взять исходный код и отладить его, чтобы увидеть, где именно он не пытается понять проблему. - person bcsanches; 09.05.2011
comment
@bcsanches не дает сбоев, работает, но картинка не загружается. - person Gabe; 14.05.2011
comment
извините, у меня закончились идеи. - person bcsanches; 25.05.2011