• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • Приглашаем на KubanCTF

    Старт соревнований 14 сентября в 10:00 по москве

    Ссылка на регистрацию в соревнованиях Kuban CTF: kubanctf.ru

    Кодебай является технологическим партнером мероприятия

Рисование В Bmp

  • Автор темы Vasilii14
  • Дата начала
Статус
Закрыто для дальнейших ответов.
V

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;
}

Не могли бы вы подсказать, в чем может проблема и что я не так сделал?
 
L

lazybiz

Ошибка может быть:
1. в режиме открытия файла (fp = fopen("probnik.bmp","ab+")).
2. в том что файл не закрывается.
 
V

Vasilii14

Да, действительно. Вот в открытии файла и была загвоздка )) Спасибо большое
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!