Рисование В Bmp

Тема в разделе "C/C++/C#", создана пользователем Vasilii14, 20 дек 2011.

Наш партнер Genesis Hackspace
Статус темы:
Закрыта.
  1. Vasilii14

    Vasilii14 Гость

    Добрый день, я пытаюсь разобраться с работой BMP в СИ. Нашел в интернете функции по работе (рисовании линии, точки, окружности), но вот есть проблема, сам BMP файл он создается, с выбранным фоном и т.д., а нарисовать что либо там не получается.

    Код (C++):
    #include <stdio.h>

    #include <math.h>

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    #include <errno.h>
    #include <stddef.h>
    #include "vg.h"

    int get_bmp_info(FILE *fp,
    bmp_magic *magic,
    bmp_header *header,
    bmp_dib_v3_header_t *dibhdr)
    {
    fseek(fp, 0, SEEK_SET);
    if (fread(magic, sizeof(bmp_magic), 1, fp) != 1)
    return -1;
    if (fread(header, sizeof(bmp_header), 1, fp) != 1)
    return -1;
    if (fread(dibhdr, sizeof(bmp_dib_v3_header_t), 1, fp) != 1)
    return -1;

    return 0;
    }

    int put_bmp_info(FILE *fp,
    bmp_magic *magic,
    bmp_header *header,
    bmp_dib_v3_header_t *dibhdr)
    {
    if (fwrite(magic, sizeof(bmp_magic), 1, fp) != 1)
    return -1;
    if (fwrite(header, sizeof(bmp_header), 1, fp) != 1)
    return -1;
    if (fwrite(dibhdr, sizeof(bmp_dib_v3_header_t), 1, fp) != 1)
    return -1;

    return 0;
    }

    void set_bmp_pixel_file(FILE *fp, int rgb, int x, int y)
    {
    int pos;
    long long int off;
    unsigned char red  = (rgb & 0xff);
    unsigned char green = ((rgb & 0xff00) >> 8);
    unsigned char blue = ((rgb & 0xff0000) >> 16);
    bmp_magic magic;
    bmp_header header;
    bmp_dib_v3_header_t  dibhdr;

    if (get_bmp_info(fp, &magic, &header, &dibhdr))
    return;

    switch(dibhdr.bitspp) {
    case 1:
    pos = (x-1) / 8;   
    fseek(fp, pos, SEEK_CUR);
    break;
    case 4:
    pos = (x-1) / 2;
    fseek(fp, pos, SEEK_CUR);
    break;
    case 8:
    fseek(fp, (x-1), SEEK_CUR);
    break;
    case 24:
    off = y - 1;
    off *= dibhdr.width * 3;
    off += header.offset;
    fseek(fp, off, SEEK_SET);
    fseek(fp, (x-1) * 3, SEEK_CUR);
    if (fwrite(&blue, 1, 1, fp) != 1)
    printf("Error1: %s\n", strerror(errno));
    if (fwrite(&green, 1, 1, fp) != 1)
    printf("Error2: %s\n", strerror(errno));
    if (fwrite(&red, 1, 1, fp) != 1)
    printf("Error3: %s\n", strerror(errno));   
    break;
    default:
    break;
    }
    }

    void set_bmp_point_file(FILE *fp, int rgb, int x, int y)
    {
    set_bmp_pixel_file(fp, rgb, x, y);
    set_bmp_pixel_file(fp, rgb, x, y+1);
    set_bmp_pixel_file(fp, rgb, x+1, y);
    if (x > 0)
    set_bmp_pixel_file(fp, rgb, x-1, y);
    if (y > 0)
    set_bmp_pixel_file(fp, rgb, x, y -1);
    }

    void draw_bmp_line(FILE *fp, int rgb,
    int x, int y,
    int x1, int y1,
    void (*set_bmp_point)(FILE *, int, int, int))
    {
    float k;
    int c;

    if (x == x1) {
    while (y != y1) {
    set_bmp_point(fp, rgb, x, y);
    y += (y < y1) ? 1: -1;

    }
    set_bmp_point(fp, rgb, x, y);
    return;
    }
    k = (y1 - y) / (x1 - x);
    c = round(y - k * x);

    if (k > -1 && k < 1) {
    while (x != x1) {
    set_bmp_point(fp, rgb, x, round(k * x + c));
    x += (x < x1) ? 1 : -1;
    }
    set_bmp_point(fp, rgb, x, round(k * x + c));
    } else {
    while (y != y1) {
    set_bmp_point(fp, rgb, round((float)(y - c) / k), y);
    y += (y < y1) ? 1 : -1;
    }
    set_bmp_point(fp, rgb, round((float)(y - c) / k), y);
    }
    }

    void draw_bmp_circle(FILE *fp, int rgb,
    int cx, int cy, int r,
    void (*set_bmp_point)(FILE *, int, int, int))
    {
    int x, y, px, py;
    float f;

    for (f = 0.001, px = r-1, py = 0; f < 6.3; f += 0.001) {
    y = r * sin(f);
    x = r * cos(f);
    draw_bmp_line(fp, rgb,
    px + cx,
    py + cy,
    x + cx,
    y + cy,
    set_bmp_point);
    py = y;
    px = x;
    }
    }

    int set_bmpv3hdr(const char *file, int width, int height)
    {
    bmp_magic magic;
    bmp_header hdr;
    bmp_dib_v3_header_t v3_hdr;
    unsigned char *b;
    FILE *fp;
    int r, fsize, bpp;

    if (width <=0 || height <= 0) {
    fprintf(stderr, "wrong width/height params.\n");
    return -1;
    }

    bpp = 3; /* 3 bytes per pixel only */

    fsize = height * width * bpp;
    b = (unsigned char *) malloc(fsize);
    if (!b) {
    fprintf(stderr, "Can't allocate %d bytes buffer.\n");
    return -1;
    }
    memset(b, 0xff, fsize);

    if ((fp = fopen(file, "wb+")) == NULL) {
    fprintf(stderr, "Can't open file %s. Reason: %s\n",
    file, strerror(errno));
    free(b);
    return -1;
    }
    fseek(fp, 0, SEEK_SET);

    magic.magic[0] = 'B';
    magic.magic[1] = 'M';
    hdr.offset = sizeof(bmp_magic) +
    sizeof(bmp_header)+
    sizeof(bmp_dib_v3_header_t);
    hdr.creator1 = 0;
    hdr.creator2 = 0;
    hdr.filesz = sizeof(bmp_magic)        +
    sizeof(bmp_header)       +
    sizeof(bmp_dib_v3_header_t) +
    height * width * bpp; /* 3 bytes per pixel */

    v3_hdr.header_sz = sizeof(bmp_dib_v3_header_t);
    v3_hdr.width = width;
    v3_hdr.height = height;
    v3_hdr.nplanes = 1;
    v3_hdr.bitspp = 24;
    v3_hdr.compress_type = 0;
    v3_hdr.bmp_bytesz = 16;
    v3_hdr.hres = 0x0b13;
    v3_hdr.vres = 0x0b13;
    v3_hdr.ncolors = 0;
    v3_hdr.nimpcolors = 0;

    r = put_bmp_info(fp, &magic, &hdr, &v3_hdr);
    if (r) {
    fclose(fp);
    free(b);
    return r;
    }

    fwrite(b, fsize, 1, fp);
    fseek(fp, 0, SEEK_SET);

    fclose(fp);

    free(b);

    return 0;
    }



    //√·‚̇ˇ ÙÛÌÍˆËˇ

    int main(int argc, char *argv[])
    {
    FILE *fp=0;
    set_bmpv3hdr("probnik.bmp",300, 300);
    fp = fopen("probnik.bmp","ab+");
    draw_bmp_line(fp, red,
    150, 0,
    150, 300,set_bmp_point_file); // Вот в этом месте пытаюсь нарисовать линию, и ничего не получается.


    return 0;
    }
    Не могли бы вы подсказать, в чем может проблема и что я не так сделал?
     
  2. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Ошибка может быть:
    1. в режиме открытия файла (fp = fopen("probnik.bmp","ab+")).
    2. в том что файл не закрывается.
     
  3. Vasilii14

    Vasilii14 Гость

    Да, действительно. Вот в открытии файла и была загвоздка )) Спасибо большое
     
Загрузка...
Похожие Темы - Рисование Bmp
  1. ilya00
    Ответов:
    17
    Просмотров:
    1.862
  2. vladden
    Ответов:
    1
    Просмотров:
    1.862
  3. 123456789igor
    Ответов:
    1
    Просмотров:
    1.406
  4. sergg
    Ответов:
    11
    Просмотров:
    4.756
  5. bearpaw
    Ответов:
    6
    Просмотров:
    3.802
Статус темы:
Закрыта.

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