Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Noterus
1 / 1 / 0
Регистрация: 25.05.2013
Сообщений: 26
#1

Чтение BMP изобржений - C++

30.11.2013, 22:30. Просмотров 650. Ответов 3
Метки нет (Все метки)

Доброе время суток. Задача считать BMP изображение и отрендарить его с помощью SDL. Написал функцию по чтению и у меня проблема в том что если ширина не кратна четырем, то изображение "ломается" и рендерит совершено не верно, а с глюками и еще проблема в том что даже если ширина кратна четырем, то рендерит перевернутое изображение.
Подскажите пожалуйста как исправить проблемы при рендеринге.. Спасибо за ответ=)
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <stdio.h>
#include <stdlib.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_ttf.h>
#include <time.h>
#undef main
 
#define _ERROR_FILE 0xA
#define _FILE_SUCCESS 0xB
 
typedef unsigned char byte;
typedef struct PIX
{
    byte R;
    byte G;
    byte B;
} Pixel;
typedef struct ImegeBMP
{
    int windth;
    int height;
    short depth;
    short state;
    Pixel **pixmap;
} Imege;
 
Imege* LoadBMP(char *path)
{
    Imege *img=(Imege*)malloc(sizeof(Imege));
    FILE *BMP=fopen(path,"rb");
    if(!BMP)
    {
        img->state=_ERROR_FILE;
        img->pixmap=NULL;
        return img;
    }
    fseek(BMP,18,SEEK_SET);
    fread(&img->windth,sizeof(img->windth),1,BMP);
    fread(&img->height,sizeof(img->height),1,BMP);
    fseek(BMP,2,SEEK_CUR);
    fread(&img->depth,sizeof(img->depth),1,BMP);
    fseek(BMP,24,SEEK_CUR);
    img->pixmap=(Pixel**)malloc(img->height*sizeof(Pixel*));
 
    int i,j;
    for(i=0; i<img->height; i++)
    {
        img->pixmap[i]=(Pixel*)malloc(img->windth*sizeof(Pixel));
        for(j=0; j<img->windth; j++)
            fread(&img->pixmap[i][j],sizeof(Pixel),1,BMP);
        }
    img->state=_FILE_SUCCESS;
    return img;
}
 
int keys(SDL_Event*e)
{
    switch(e->key.keysym.sym)
    {
    case SDLK_ESCAPE:
        return 0;
        break;
    }
}
 
 
int main(int arge,char**argv)
{
    srand(time(0));
 
    if(SDL_Init(SDL_INIT_VIDEO)<0)
    {
        puts("video_error");
        return 1;
    }
    if(TTF_Init()<0)
    {
        puts("text_error");
        return 1;
    }
 
 
    Imege *img=LoadBMP("ti.bmp");
    printf("%d\n",img->state);
 
    SDL_Window *win=SDL_CreateWindow("Menu",SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,1000,600,SDL_WINDOW_SHOWN);
    SDL_Renderer*ren=SDL_CreateRenderer(win,-1,SDL_RENDERER_SOFTWARE);
 
 
 
    int i,j;
    for(i=0;i<img->height;i++){
        for(j=0;j<img->windth;j++){
            SDL_SetRenderDrawColor(ren,img->pixmap[i][j].B,img->pixmap[i][j].G,img->pixmap[i][j].R,NULL);
            SDL_RenderDrawPoint(ren,j,i);
        }
    }
SDL_RenderPresent(ren);
SDL_Delay(5000);
 
 
    return 0;
}


P.s: Рендерю по пиксельно
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.11.2013, 22:30     Чтение BMP изобржений
Посмотрите здесь:

Чтение BMP 24 - C++
Здравствуйте! Задача: Нужно зашифровать текстовый файл в картинку формата BMP24. Проблема: Перечитал около десятка страниц форумов но...

Чтение BMP файла и его обработка - C++
Есть задание на изучение эффективного кодирования методом Шеннона-Фано. Для этого берётся фотография 128х128 пикселей, с глубиной цвета 256...

bmp 8 - C++
Помогите пожалуйста, нужно реализовать алгоритм Линде-Бузо-Грея для BMP файла. Проблема появляется при записи файла в формат bmp 8 -...

bmp в C++ - C++
Помогите пожалуйста написать программу на C++ которая уменьшает разрешение bmp картинки в 2 раза. Можно использовать только библиотеку ...

Считывание bmp - C++
Здравствуйте, мне надо считать изображение, содержащая только 2х цветную палитру, и просканировать картинку на наличие черных пикселей,...

Стеганография в BMP - C++
Проект выполняющий метод lsb. В коде ошибки. Не могу понять как исправить. Прошу помочь, может кто разбирается в таких вещах. ...

Открытие .bmp - C++
Как открыть .bmp в VS 2012?

Wav в bmp - C++
Подскажите, пожалуйста, как разложить побитово wav-file и сложить его в bmp? Можно примеры кода?

[C++] 24-битные BMP - C++
Программа не хочет кодировать 24-битные BMP. Под кодированием я понимаю разбитие изображение на квадраты по 10 пикселей (в программе - по...

bmp (24 битный) - C++
Ребят всем привет я бы выложил тут код,ну на самом деле с моей точки зрения это не к чему.Встала задача открыть 24 битный bmp файл и...

BMP - файл - C++
Доброго времени суток ! Друзья, где можно почитать про BMP файлы, посмотреть примеры (код) ? Интересует: как изменить яркость. ...

Проблема с масштабированием BMP - C++
Проблема в следующем: вывожу в клиентское окно BMP-картинку (Truecolor, 24 bit, размер - 1024х960), которую читаю с диска. При этом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dmitry74
0 / 0 / 0
Регистрация: 04.10.2013
Сообщений: 10
30.11.2013, 23:48     Чтение BMP изобржений #2
То, что рендерит перевернутое изображение - это нормально(http://ru.wikipedia.org/wiki/BMP , один из комментариев в примере кода внизу).

C++
1
img->pixmap=(Pixel**)malloc(img->height*sizeof(Pixel*));
Подозреваю, что должно быть так:

C++
1
img->pixmap=(Pixel**)malloc(img->height*sizeof(Pixel));
Noterus
1 / 1 / 0
Регистрация: 25.05.2013
Сообщений: 26
01.12.2013, 00:08  [ТС]     Чтение BMP изобржений #3
Цитата Сообщение от Dmitry74 Посмотреть сообщение
Подозреваю, что должно быть так:
Код C++
1
img->pixmap=(Pixel**)malloc(img->height*sizeof(Pixel));
Нет, это так не должно быть. Т.к. я выделяю память под двумерный массив, а это что-то странное, а не выделение памяти - это нельзя назвать не выделением под одномерный массив не под двумерный массив.

C
1
2
3
4
5
6
7
8
9
    img->pixmap=(Pixel**)malloc(img->height*sizeof(Pixel*));
 
    int i,j;
    for(i=0; i<img->height; i++)
    {
        img->pixmap[i]=(Pixel*)malloc(img->windth*sizeof(Pixel));
        for(j=0; j<img->windth; j++)
            fread(&img->pixmap[i][j],sizeof(Pixel),1,BMP);
        }
Посмотрите вот я выделяю памяти и под ячейки, а картинка - это двумерный массив.
Для экономии памяти я сразу и заполняю...

Кстати спасибо за сылку, ато я это не видел и сам капался в файле=(
Croessmah
Модератор
Эксперт CЭксперт С++
13045 / 7308 / 814
Регистрация: 27.09.2012
Сообщений: 18,041
Записей в блоге: 3
Завершенные тесты: 1
01.12.2013, 02:54     Чтение BMP изобржений #4
Википедия отвечает на вопросы:
Цитата Сообщение от Noterus Посмотреть сообщение
Написал функцию по чтению и у меня проблема в том что если ширина не кратна четырем, то изображение "ломается" и рендерит совершено не верно
Последовательность пикселей, записанных в том или ином виде. Пиксели хранятся построчно, снизу вверх. Каждая строка изображения дополняется нулями до длины, кратной четырём байтам.

Цитата Сообщение от Noterus Посмотреть сообщение
еще проблема в том что даже если ширина кратна четырем, то рендерит перевернутое изображение.
Пиксели хранятся построчно, снизу вверх.
Yandex
Объявления
01.12.2013, 02:54     Чтение BMP изобржений
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru