Bmp в Bc 3.1 For Dos

Тема в разделе "Общие вопросы по С и С++", создана пользователем LeRoN, 2 апр 2006.

Статус темы:
Закрыта.
  1. LeRoN

    LeRoN Гость

    Уважаемые знатоки помогите справится с такой проблемой:
    У меня возникла проблема с выводом бмп-картинки на экран...
    а точнее - у меня выводится картинка другими цветами(палитру считываю из файла, может это я и не правильно делаю).

    Код (Text):
    #include <conio.h>
    #include <stdio.h>
    #include <alloc.h>

    #define PALETTE_MASK 0x3C6
    #define PALETTE_REGISTER_RD 0x3C7
    #define PALETTE_REGISTER_WR 0x3C8
    #define PALETTE_DATA 0x3C9

    unsigned char far *video_buffer = (char far*)0xA0000000L;

    typedef struct RGB_color_typ
    {
    unsigned char red;
    unsigned char green;
    unsigned char blue;
    unsigned char x;
    } RGB_color, *RGB_color_ptr;

    void set_mode(int mode)
    {
    _asm    {
    mov ah,0
    mov al, BYTE PTR mode
    int 10h
    }
    }

    void setpixel(int x, int y, int color)
    {
    video_buffer[((y<<8)+(y<<6))+x]=color;
    }

    void Set_Palette_Register (int index, RGB_color_ptr color)
    {
    outp(PALETTE_MASK, 0xFF);
    outp(PALETTE_REGISTER_WR, index);
    outp(PALETTE_DATA, color->blue);
    outp(PALETTE_DATA, color->green);
    outp(PALETTE_DATA, color->red);
    }

    void main()
    {
    FILE *f;
    char *ms;
    long int count;
    int num=0;
    int data=0;
    int i, j;
    RGB_color pal[256];
    clrscr();
    printf ("Memory available: %ld bytes\n",farcoreleft());
    unsigned char far* temp_buffer = (unsigned char far *)farcalloc(64000,sizeof(unsigned char));
    if (!(f = fopen ("XZC.bmp","rb")))
    printf("Error");
    fseek(f,54,SEEK_SET);
    for (num = 0; num <256; num++)
    {
    pal[num].red=(getc(f) >>2);
    pal[num].green=(getc(f) >>2);
    pal[num].blue=(getc(f) >>2);
    pal[num].x=(getc(f) >>2);
    Set_Palette_Register(num, (RGB_color_ptr)&pal[num]);
    }

    fseek(f,1078,SEEK_SET);
    getch();
    count = 64000;
    while (count >0)
    {
    data =getc(f);
    temp_buffer[--count]=data;
    }

    fclose(f);
    set_mode (0x13);
    for (i = 0; i < 200; i++)
    for (j = 0; j < 320; j++)
    setpixel(320-j,i,temp_buffer[((i<<8)+(i<<6))+j]);
    getch();
    set_mode(0x03);
    farfree(temp_buffer);
    }
     
  2. Froex

    Froex Гость

    Вы не пробовали пользоваться DirectDraw?
     
  3. orcommander

    orcommander Гость

    Бегло глянул на твой код, и вот у тебя смещение в файле на 54 стоит - это для bmp-шки с 24 глубиной, ты в курсе? И... "320-j" я так понимаю ты имеешь в виду обратный порядок строк, но это ведь получится обратный порядок столбцов...
    Попробуй наоборот
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей