Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с BMP файлом 
:(
    Опции темы
botnet
Дата 4.6.2007, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 13.5.2007

Репутация: -1
Всего: -1



Господа!
Товарищи!

Проблема с сохранением в BMP.



Описание:
Есть 24-битный BMP файл.
Требуеться элементарно сохранить его под другим названиме, предварительно  например увеличив яркость картинки на 10%.

Помогите пожайлуста, вдруг у кого есть код рабочий.

Только не говорите, что мол почитай что такое BMP файл, сядь и напиши программу.
Я знаю и структуру BMP файла, и примерно понимаю как с ним работать. Но возникли несколько проблем.(Например каким то образом структура BMPHEADER имеет нечетный размер)... и т.д.

Если у кого-то есть любой исходник по этой теме - буддте так пожайлуста добры - скиньте его сюда




PM MAIL   Вверх
Alexeis
Дата 4.6.2007, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



botnet, воспользуйтесь поиском. Действительно на моей памяти уже было несколько рабочих решений.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
bsa
Дата 4.6.2007, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Есть довольно простое решение - возьми либу, понимающую этот формат, например DevIL или FreeImage, и ее средствами сделай то, что тебе надо.
PM   Вверх
botnet
Дата 4.6.2007, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 13.5.2007

Репутация: -1
Всего: -1



Вас всех прекрасно понял. Тогда несколько уточнений.

1) Нельзя использовать WinAPI и т.д. либы

2) Я прекрасно понимаю нежелание отвечать на глупые вопросы, которые уже задавались.
Но...

http://forum.vingrad.ru/forum/topic-152088...Cbmp/index.html 

По этой ссылке и еще по 10ку подобных я смотрел всё что там написанно.
И везде чего-то не хватает. Возникают какие то глупые проблемы.

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


PM MAIL   Вверх
botnet
Дата 5.6.2007, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 13.5.2007

Репутация: -1
Всего: -1



)))Мда... 

говорить вы ребята конечно мастера. А как человеку просто помочь, не выёживаясь при этом. Так сразу пас
PM MAIL   Вверх
nerezus
  Дата 5.6.2007, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 3
Всего: 43



botnet, давай я тебе помогу, без проблем.
$200


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
Alexeis
Дата 5.6.2007, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(botnet @  5.6.2007,  09:27 Найти цитируемый пост)
говорить вы ребята конечно мастера. А как человеку просто помочь, не выёживаясь при этом. Так сразу пас 

  Очень даже можем, но тогда эту тему следует перенести в "Центр помощи". В проф разделах не решают задачи за вас, а только помогают в решении. В центр помощи решают задачи целиком. Потому и негодование.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
jonie
Дата 5.6.2007, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



Цитата

1) Нельзя использовать WinAPI и т.д. либы
ежели программа будет под винду компилится то не юзать winAPI это что-то нечто...
Цитата

Народ, может вместо того, чтобы говорить почему мне не нужно помогать, вы возьмёте и поможете?
ну так возьми спецификацию BMP, прочитай, реализуй чтение, а далее - 
для каждой компоненты (R,G,B) сделать 
Код

//
//увеличение яркости
//ColorByte[i] - компонент цвета пикселя (R,G или B)
//persent - процент увеличения яркости , например persent =20;
//
 ColorByte[i] = ColorByte[i] + ((0xFF-ColorByte[i])*persent/100)&0xFF;

только альфаканал не надо трогать...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Alexeis
Дата 5.6.2007, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Код

void __fastcall TForm1::FormCreate(TObject *Sender)
{
   BITMAPFILEHEADER      BMH;
   LPBITMAPINFOHEADER PBIH;
   TFileStream *fs1, *fs2;
   fs1 = new TFileStream("D:\\Scan0002.bmp", fmOpenRead);
   fs2 = new TFileStream("D:\\Scan0003.bmp", fmCreate);

   fs1->ReadBuffer(&BMH, sizeof(BMH));
   fs2->WriteBuffer(&BMH, sizeof(BMH));

   int BIHSize;
   fs1->Read(&BIHSize, sizeof(int));
   fs1->Position = fs1->Position - sizeof(int);

   PBIH = (BITMAPINFOHEADER*) new int[BIHSize];
   fs1->ReadBuffer(PBIH, BIHSize);
   fs2->WriteBuffer(PBIH, BIHSize);

   if (PBIH->biBitCount == 24) {
       int lineSize = (((PBIH->biWidth * PBIH->biBitCount + 7) / 8) + 3) / 4 * 4;
       int bufsize  = lineSize * PBIH->biHeight;

       byte *buf = new byte[bufsize];

       fs1->ReadBuffer(buf, bufsize);

       for (int i = 0; i < bufsize; i++) {
           if (buf[i] > 225) {
              buf[i] = 255;
           }
           else buf[i] = buf[i] + 30;
       }
       fs2->WriteBuffer(buf, bufsize);

       int padding = fs1->Size - fs1->Position;

       if (padding > 0) {
           fs2->CopyFrom(fs1, padding);
       }
       delete[] buf;
   }

   delete[] PBIH;
   delete fs1;
   delete fs2;
}


Это сообщение отредактировал(а) Alexeis - 5.6.2007, 10:21


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
jonie
Дата 5.6.2007, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



Код

 int lineSize = (((PBIH->biWidth * PBIH->biBitCount + 7) / 8) + 3) /4 * 4;
типа тест оптимизатора?)
и у меня этот код вообще вылетает со Stream Read Error....


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Alexeis
Дата 5.6.2007, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



jonie, нет это просто универсальный метод определения длинны строки. 
(PBIH->biWidth * PBIH->biBitCount + 7) / 8 - вот это учет выравнивания битов на границу байтов.

А , + 3) / 4 * 4; Это выравнивание строки на границу двойного слова. 

jonie, скинь свой файлик, писал по памяти, может чего и забыл smile . Мой вроде без проблем осветлился.

Добавлено через 6 минут и 35 секунд
А ну да верно будет так перед 
      
fs1->ReadBuffer(buf, bufsize);

установить начало чтения растра по  BITMAPFILEHEADER 
т.е. добавить строчку

fs1->Position = BMH.bfOffBits;

Тогда полный код должен получиться

Код

void __fastcall TForm1::FormCreate(TObject *Sender)
{
   BITMAPFILEHEADER      BMH;
   LPBITMAPINFOHEADER PBIH;
   TFileStream *fs1, *fs2;
   fs1 = new TFileStream("D:\\Scan0002.bmp", fmOpenRead);
   fs2 = new TFileStream("D:\\Scan0003.bmp", fmCreate);

   fs1->ReadBuffer(&BMH, sizeof(BMH));
   fs2->WriteBuffer(&BMH, sizeof(BMH));

   int BIHSize;
   fs1->Read(&BIHSize, sizeof(int));
   fs1->Position = fs1->Position - sizeof(int);

   PBIH = (BITMAPINFOHEADER*) new int[BIHSize];
   fs1->ReadBuffer(PBIH, BIHSize);
   fs2->WriteBuffer(PBIH, BIHSize);

   if (PBIH->biBitCount == 24) {
       int lineSize = (((PBIH->biWidth * PBIH->biBitCount + 7) / 8) + 3) / 4 * 4;
       int bufsize  = lineSize * PBIH->biHeight;

       byte *buf = new byte[bufsize];

       fs1->Position = BMH.bfOffBits;
       fs1->ReadBuffer(buf, bufsize);

       for (int i = 0; i < bufsize; i++) {
           if (buf[i] > 225) {
              buf[i] = 255;
           }
           else buf[i] = buf[i] + 30;
       }
       fs2->WriteBuffer(buf, bufsize);

       int padding = fs1->Size - fs1->Position;

       if (padding > 0) {
           fs2->CopyFrom(fs1, padding);
       }
       delete buf;
   }

   delete PBIH;
   delete fs1;
   delete fs2;
}



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0813 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.