Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Вывод картинок в графическом режиме


Автор: Inst 28.5.2006, 20:30
Работаю в графическом режиме 16 цетов, 640*480.
Написал фунцкию вывода картинок:
Код

char *picture (char *filename)
{
    FILE *fl;
    char *p1;
    unsigned long size;
    fl=fopen (filename,"r");
    size=filelength(fileno(fl));
    p1=(char*)malloc(size);
    fread (p1,1,size,fl);
    fclose (fl);
    printf ("%d",size);
    getch ();
    return (p1);
}


Потом, например: 
Код

char *fon = picture ("fon");
putimage (0,0,fon,1);

(Да, картинки в формате gra, т.е. они вообще без разрешения, я их из bmp специальной программой конвертировал)
Но: обычно в Паскале подобной фунцкией я выводил без проблем картинки до 64 кб. Здесь же иногда выведет картинку 38 кб нормально (на которой допустим мало содержимого), а иногда 8кб вообще криво выводит, с помехами, не знаю, size переглючивает.
Подскажите, что делать? Или есть еще норм. способ вывода картинок?
з.ы. Среда: Borland C под DOS =)
Заранее спасибо 

Автор: Inst 28.5.2006, 21:28
Так, есть прогресс:
Если исправить вот так:
fl=fopen (filename,"rb");
Т.е. не "r" а "rb"  (я так понял это readblock) то читает нормально файлы до 32кб. 
Но все же, чтобы вывести картинку на полный экран (128 кб) получается ее надо разбить на 4 файла. Не удобно, особенно если у меня много таких картинок... smile((
Не знаете как можно сделать чтобы считывать и выводить большие картинки? (128кб или хотя бы уж 64кб).
Заранее спасибо (еще раз) =) 

Автор: volvo877 29.5.2006, 17:32
Inst, зачем мешать в одну кучу С и С++?
Пользуйся чем-то одним:
Код
char far *picture (char *filename)
{
    FILE *fl;
    char *p1;
    unsigned long size;
    fl = fopen (filename,"rb"); // Это, кстати, Read Binary, а не Read Block
    fseek(fl, 0L, SEEK_END);
    size=ftell(fl);
    p1=(char far *)farmalloc(size); // farmalloc может выделять больше 64К
    fread (p1,1,size,fl);
    fclose (fl);
    printf ("%d",size);
    getch ();
    return (p1);
}

...
char far *fon = picture ("fon");
putimage(0, 0, fon, 1);
...

Только вот программу компилируй НЕ в модели памяти "tiny" 

Автор: Inst 29.5.2006, 20:48
Цитата(volvo877 @  29.5.2006,  17:32 Найти цитируемый пост)
Только вот программу компилируй НЕ в модели памяти "tiny" 

Спасибо, но вот это что значит?
 

Автор: Inst 30.5.2006, 17:01
Ааа подскажите, что делать, у меня на середине программа виснет или вообще перестает что-то выводить в граф. режиме!
Наверное она съедает всю память!
Что делать? 
Мне проект завтра сдавать =))
В функции подгрузки картинок я использую free (p1);
Все равно такое ощущение как будто памяти [censored 6]...
(Пишу же под DOS борландом, там памяти дается наверное килобайт 128, [censored 6] smile )
Заранее спасибо за помощь! 

Автор: bsa 31.5.2006, 10:18
Ты, наверное, забываешь сделать free, для выделенной памяти. Поэтому у тебя она и съедается.
К тому же, размер блока, который могут читать стандартные досовые функции - 65535 (именно 65536-1) байт.
У меня есть сомнения, что возможно чтение через границу сегментов. Поэтому, самый лучший способ это: открытие файла, выделение буфера, чтение части картинки в буфер, вывод на экран, чтение следующей части..., освобождение буфера, закрытие файла. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)