Rambler's Top100

Твой мир ПРОграммирования-Delphi, Pascal, C++

Объявление

Если это Ваш первый визит на форум, то советуем зарегистрироваться. Зарегистрированные пользователи могут задавать вопросы и просматривать темы со скрытым текстом. Чтобы зарегистрироваться, нажмите Регистрация.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Твой мир ПРОграммирования-Delphi, Pascal, C++ » Программирование. Разное. » Создание компонента BmpImage


Создание компонента BmpImage

Сообщений 1 страница 15 из 15

1

Привет. Здесь я расскажу о том как правильно описать формат bmp и покажу основные приемы кодинга. Конкретно прочитать про создание компонентов можно будет в статье "Создание компонентов".

BMP формат разрабатывался для OS Windows и широко в ней применяется, но он был разработан как кросплатформенный формат и у него есть для этого все необходимые атрибуты. Заголовок BMP-файла состоит из 2х частей, собственно заголовка "FILE HEADER" и информационной части "INFORMATION HEADER". Описание всего этого хозяйства приведено ниже:

Скрытый текст:

Для просмотра скрытого текста - войдите или зарегистрируйтесь.

0

2

Хочу обратить ваше внимание на следующее:
Number of bits per pixel – Может принимать следующие значения: 1 (черно-белое изображение); 4 (16 цветов); 8 (256 цветов); 24 (16.7 миллиона цветов).

Скрытый текст:

Для просмотра скрытого текста - войдите или зарегистрируйтесь.

0

3

ПРИМЕР ЗАГРУЗКИ .BMP:
Класс для хранения изображения выглядит примерно так:

#define T_RGB 24
#define T_RGBA 32

Скрытый текст:

Для просмотра скрытого текста - войдите или зарегистрируйтесь.

0

4

Теперь опишем конструктор и деструктор для нашего класса...

Скрытый текст:

Для просмотра скрытого текста - войдите или зарегистрируйтесь.

0

5

А теперь опишем процедуру загрузки изображения. Некоторые строчки в описании заголовка закомментированы, поскольку мы используем аналогичные переменные из нашего класса, но я оставил из для наглядности:

Скрытый текст:

Для просмотра скрытого текста - войдите или зарегистрируйтесь.

0

6

FILE *file = fopen(fName, "rb"); // Открытие BMP файла
// FILE HEADER
if(file != NULL) // Если файл существует...

Скрытый текст:

Для просмотра скрытого текста - войдите или зарегистрируйтесь.

0

7

Скрытый текст:

Для просмотра скрытого текста - войдите или зарегистрируйтесь.

0

8

// Читаем размер hPPM

Скрытый текст:

Для просмотра скрытого текста - войдите или зарегистрируйтесь.

0

9

// Выделяем память под данные илображения (высота * ширина * байт_на_пиксель)

Скрытый текст:

Для просмотра скрытого текста - войдите или зарегистрируйтесь.

0

10

// BGR to RGB обмениваем R и B компоненты цвета
for(unsigned int cswap = 0; cswap < imgSize; cswap += bytesPerPixel)
{
// Первый байт XOR третий байт XOR первый байт XOR третий байт
imageData[cswap] ^= imageData[cswap+2] ^= imageData[cswap] ^= imageData[cswap+2];
}
fclose(file);
// изображение загружено все ОК!
return true;
}

Ну и кому интересно, вот код который выполняет сохранение изображения на ХДД в .BMP формате. Как оказалось, это еще проще %) чем загрузка...

Скрытый текст:

Для просмотра скрытого текста - войдите или зарегистрируйтесь.

0

11

int bytesPerPixel = bpp/8;
fSize = width * height * bytesPerPixel;
FILE *file = fopen(fName, "wb"); // Открытие BMP файла для записи
// FILE HEADER
if(file != NULL) // Если файл существует...

Скрытый текст:

Для просмотра скрытого текста - войдите или зарегистрируйтесь.

0

12

// пишем данные изображения

Скрытый текст:

Для просмотра скрытого текста - войдите или зарегистрируйтесь.

Вот и все, что я хотел рассказать о .BMP формате. Надеюсь, Вам это хоть чем-то поможет!...

0

13

Спасибо большое, очень помогло, но есть замечания по фомату.
С я чем столкнулся:
unsigned long bitSize = 0; // (4 bytes) размер изображения в байтах (0 if BI_RGB) - не обязательно равно 0,  но может быть равно 0 при BI_RGB, проверку на равность 0 желательно убрать.
unsigned long hPPM = 2834; // (4 bytes) кол-во пикселей на метр по горизонтали
unsigned long vPPM = 2834; // (4 bytes) кол-во пикселей на метр по вертикали
Оба эти значения не обязательно должны иметь значение отличное от 0.
Я нормально смог вывести на экран изображение при hPPM = 0 и vPPM = 0.

0

14

Спасибо. Учту изменения.

0

15

как написать чтобы текстовый редактор форматировал целый обзац после 65 знака

0


Вы здесь » Твой мир ПРОграммирования-Delphi, Pascal, C++ » Программирование. Разное. » Создание компонента BmpImage