Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.09.2010, 09:52   #1
Lerank
Пользователь
 
Регистрация: 30.11.2008
Сообщений: 18
Восклицание Преобразование bmp файлов

Помогите пожалуйста или подскажите чем сможете!
вот нужно написать программу (только на С, С++ не подходит), которая конвертирует изображение формата .bmp(256 цветовой).
Падо считать файл преобразовать его в памяти в формат, прописанный в протоколе взаимодействия (опишу ниже) и сохранить его в выходном файле для дальнейшей обработки другими задачами.
На счет протокола: надо под цвет отвести 4 байта, первые 3 байта это будет сам цвет, а 4-ый это количество его повторений, т.е. например у рисунка продолжительный белый фон то это будет выглядить примерно так FF FF FF 255 (255 это макс число повторений так как для него идет тип char).
Также надо не забыть выделять память при считывании файла и при создании выходного файла.
Вот структура bmp файла (нужна для выделения памяти ширина*высоту изображения, ну и может быть в дальнейшем пригодится):

Код:
typedef struct
{
char bfType[2]; // Тип файла
unsigned long bfSize; // Размер файла в байтах
unsigned short bfReserved1; // Резерв
unsigned short bfReserved2; // Резерв
unsigned long bfOffBits; // Смещение начала изображения
unsigned long biSize; // Размер заголовка 
unsigned long biWidth; // Ширина изображения в пикс
unsigned long biHeigth; // Высота изображения в пикс
unsigned short biPlanes; // Число плоскостей изображения
unsigned short biBitCount; // Бит/пикс 1,4,8,24
unsigned long biCompression; // Тип сжатия
unsigned long biSizeImage; // Размер сжатого изображения
unsigned long biXPelsPerMeter; // Горизонт. размещение пикс/м
unsigned long biYPelsPerMeter; // Вертик. размещение пикс/м
unsigned long biClvUsed; // Кол-во используемых цветов
unsigned long biClrImportant; // Число важных цветов
}stbit;
И чуть не забыл: нужно выделить 54 байта под заголовок, 1024 байта под палитру, а остальное под само изображение.
Если что-то не понятно написано напишите я постораюсь объяснить смысл задания, т.к. сам его получал в устной форме и мог что нить забыть.


Код:
typedef struct
{
char bfType[2]; // Тип файла
unsigned long bfSize; // Размер файла в байтах
unsigned short bfReserved1; // Резерв
unsigned short bfReserved2; // Резерв
unsigned long bfOffBits; // Смещение начала изображения
unsigned long biSize; // Размер заголовка 
unsigned long biWidth; // Ширина изображения в пикс
unsigned long biHeigth; // Высота изображения в пикс
unsigned short biPlanes; // Число плоскостей изображения
unsigned short biBitCount; // Бит/пикс 1,4,8,24
unsigned long biCompression; // Тип сжатия
unsigned long biSizeImage; // Размер сжатого изображения
unsigned long biXPelsPerMeter; // Горизонт. размещение пикс/м
unsigned long biYPelsPerMeter; // Вертик. размещение пикс/м
unsigned long biClvUsed; // Кол-во используемых цветов
unsigned long biClrImportant; // Число важных цветов
}stbit;

int main()
{
FILE*pf;
int i;
pf=fopen("Font.bmp", "rb");
if (pf!=0)
{
fread(&stbit,54,1,pf); //Считывание заголовка
fread(&stbit,1024,1,pf); //считывание палитры
fcloze(pf);
}
}
Вот когда я начинаю считывать палитру он пишет что не хватает памяти, как ее выделить и подо что?
Lerank вне форума Ответить с цитированием
Старый 21.09.2010, 10:54   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

Вы уверены, что в stbit 1024 байта есть??? Что за идиотизм и заголовок, и данные читать в одну и туже переменную? Как вы потом планируете доступ к полям заголовка? Опять перечитывать?
p51x вне форума Ответить с цитированием
Старый 21.09.2010, 12:15   #3
Lerank
Пользователь
 
Регистрация: 30.11.2008
Сообщений: 18
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Вы уверены, что в stbit 1024 байта есть??? Что за идиотизм и заголовок, и данные читать в одну и туже переменную? Как вы потом планируете доступ к полям заголовка? Опять перечитывать?
Извиняюсь, ошибся дурак в stbit считываем только заголовок там вроде ровно 54 байта. Я хотел спросить как мне вот под другую переменную выделить памяти для палитры.
Lerank вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Преобразование заголовочный файлов в MASM Zap Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 03.05.2009 00:17
Проблема преобразование jpg в bmp через dll inndim Общие вопросы Delphi 5 24.06.2008 18:24