Исследование растровых форматов хранения изображений на примере BMP

Автор работы: Пользователь скрыл имя, 03 Июля 2012 в 02:14, лабораторная работа

Описание работы

Цель работы: изучить основные форматы хранения растровых изображений, по-лучить навыки формирования и чтения изображений в формате BMP с использованием стандартных средств языка С++.
Задание
В процессе работы необходимо на языке C++ реализовать компонент чтения и за-писи растровых изображений в формате BMP. Работу программы продемонстрировать на примере чтения изображения из файла и сохранения в другом файле его вертикального зеркального отображения.

Файлы: 1 файл

отчёт.doc

— 1.19 Мб (Скачать файл)

 

Министерство образования и науки Российской Федерации

Государственное образовательное учреждение высшего профессионального образования

Санкт-Петербургский государственный университет

информационных технологий, механики и оптики

Факультет Фотоники и оптоинформатики

Кафедра Компьютерной фотоники и видеоинформатики

 

Дисциплина: Научно-исследовательская работа студентов

 

 

 

 

 

 

Отчет

по научно-исследовательской работе № 1

Исследование растровых форматов хранения
изображений на примере BMP

 

 

 

 

 

 

Выполнил: Рамзаев А.В.

Группа: 2362

Преподаватель: Волынский М.А.

 

 

 

 

 

 

Дата

Количество баллов

Подпись
преподавателя

Теория

 

 

 

 

Программа

 

 

 

 

Отчет

 

 

 

 

 

Санкт-Петербург

2011 г.

Цель работы: изучить основные форматы хранения растровых изображений, получить навыки формирования и чтения изображений в формате BMP с использованием стандартных средств языка С++.

Задание

 

В процессе работы необходимо на языке C++ реализовать компонент чтения и записи растровых изображений в формате BMP. Работу программы продемонстрировать на примере чтения изображения из файла и сохранения в другом файле его вертикального зеркального отображения.

Вариант 2

Исходные данные

 

              На вход программы подается изображение в формате BMP (рис. 1).

 

Результат работы программы

 

              На выходе программы получается файл с вертикальным зеркальным отображением входного изображения. Файл, получаемый в результате работы программы, представлен на рис. 2.

                                                                

Рис. 1. Исходное изображение                                    Рис. 2. Результат работы программы    

 

Выводы

              Благодаря простой структуре файла, формат BMP очень удобен для хранения изображений с которыми планируется работать программно, из минусов хочется отметить патентную закрытость и отсутствие сжатия.

Приложение

 

Листинг

#include <iostream>

#include <fstream>

#include <stdio.h>

#include <stdlib.h>

#include <vector>

 

class pixel {

public:

              char Blue, Green, Red;

              pixel(){

              Red=0;

              Green=0;

              Blue=0;

                            }

              pixel (char _Red, char _Green, char _Blue) {

              Red=_Red;

              Green=_Green;

              Blue=_Blue;

                            }

              };

 

class MyBMP {

public:

                            unsigned int bfSize;

                            unsigned int bfOffBits;

                            int Width, Height;

                            unsigned int BitCount;

                            int XPerMeter, YPerMeter;

                            std::vector<pixel> rastr;

 

                            MyBMP (int wid, int hei){

                                          Width=wid;

                                          Height=hei;

                                          rastr.resize(Width * Height);

                                          XPerMeter=100000;

                                          YPerMeter=100000;

                            }

 

                            MyBMP () {

                                          Width=1;

                                          Height=1;

                                          rastr.resize(Width * Height);

                                          XPerMeter=100000;

                                          YPerMeter=100000;

                            }

 

              void ReadBMP(char* line) {

                            bfSize = 40;

                            std::ifstream file(line, std::ios::binary);

                            file.seekg(2);

                            file.read(reinterpret_cast<char*>(&bfSize),sizeof(bfSize));

                            file.seekg(10);

                            file.read(reinterpret_cast<char*>(&bfOffBits),sizeof(bfOffBits));

                            file.seekg(18);

                            file.read(reinterpret_cast<char*>(&Width),sizeof(Width));

                            file.seekg(22);

                            file.read(reinterpret_cast<char*>(&Height),sizeof(Height));

                            file.seekg(28);

                            file.read(reinterpret_cast<char*>(&BitCount),sizeof(BitCount));

                            file.seekg(38);

                            file.read(reinterpret_cast<char*>(&XPerMeter),sizeof(XPerMeter));

                            file.seekg(42);

                            file.read(reinterpret_cast<char*>(&YPerMeter),sizeof(YPerMeter));

 

                            rastr.resize(MyBMP::Width * MyBMP::Height);

                            file.seekg(MyBMP::bfOffBits);

                            for (int i=0; i<MyBMP::Height; i++) {

                                          for (int j=0; j<MyBMP::Width; j++) {

                                                        file.read(reinterpret_cast<char*>(&rastr[i*Width + j]),sizeof(pixel));

                                          }

                            }

 

 

              }

 

              void SaveBMP (char* line) {

                            FILE * out=fopen(line, "wb");

                            fwrite( &"BM", 2, 1, out );

                            fwrite( &bfSize, 4, 1, out );

                            unsigned int Temp=0;

                            fwrite( &Temp, 4, 1, out );

                            fwrite( &bfOffBits, 4, 1, out );

                            Temp=40;

                            fwrite( &Temp, 4, 1, out );

                            fwrite( &Width, 4, 1, out );

                            fwrite( &Height, 4, 1, out );

                            short sTemp=1;

                            fwrite( &sTemp, 2, 1, out );

                            fwrite( &BitCount, 2, 1, out );

                            Temp=0;

                            fwrite( &Temp, 4, 1, out );

                            Temp=3*Width*Height;

                            fwrite( &Temp, 4, 1, out );

                            fwrite( &XPerMeter, 4, 1, out );

                            fwrite( &YPerMeter, 4, 1, out );

                            Temp=0;

                            fwrite( &Temp, 4, 1, out );

                            Temp=0;

                            fwrite( &Temp, 4, 1, out );

                            char chTemp;

 

                            for (int i=0; i<MyBMP::Height; i++) {

                                          for (int j=0; j<MyBMP::Width; j++) {

                                                        chTemp=GetPixel(j,i).Blue;

                                                        fwrite( &chTemp, 1, 1, out );

                                                        chTemp=GetPixel(j,i).Green;

                                                        fwrite( &chTemp, 1, 1, out );

                                                        chTemp=GetPixel(j,i).Red;

                                                        fwrite( &chTemp, 1, 1, out );

                                          }

                            }

                            fclose(out);

 

              }

 

              pixel GetPixel (int Wid, int Hei) {

                                          return(rastr[Hei * Width + Wid]);

                            }

              pixel IventPixel (int Wid, int Hei, pixel pi) {

                            rastr[Hei * Width + Wid]=pi;

                            return pi;

              }

};

 

int main (){

              MyBMP img;

              pixel Temp;

              img.ReadBMP("lena_original.bmp");

              for (int i=0; i<img.Width/2; i++){

                            for (int j=0; j<img.Height; j++) {

                                          Temp=img.GetPixel(i,j);

                                          img.IventPixel(i,j,img.GetPixel(img.Width-i,j));

                                          img.IventPixel(img.Width-i,j,Temp);

                            }

              }

              img.SaveBMP("lena2.bmp");

}

 

 

Информация о работе Исследование растровых форматов хранения изображений на примере BMP