Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Изменение разрядности битмапов  (Прочитано 4920 раз)
0 Пользователей и 1 Гость смотрят эту тему.
acc15
Гость
« : 25-12-2005 01:07 » 

Суть слудующая:
есть битмап. (прошу не путать с HBITMAP, CBitmap'ом и прочими классами для работы с битмапами, т.е. именно массив тех самых битов) разрядность его составляет, скажем, 16 бит. Нужно изменить разрядность на 4 бита (организовать паллету, и преобразовать собственно 16 бит в 4 бита) Вопрос: вот как мне определять цвета которые нужно "загонять" в паллету, да и чтоб с учётом её макс. размера (16 цветов). Вот как мне сравнивать R,G,B так чтобы весь рабочий диапазон цветов был разбит на 16 (или меньше, зависит от битмапа) "частей", так чтобы каждая часть приблизительно соответсвовала тому оттенку к которому она относится. Кстати формат не имеет значения (5:6:5, 5:5:5, без разницы). Короче грубо говоря, надо из битмапа большей битности сделать битмап меньшей битности( исключения составляют безпаллетные битмапы, т.е. как преобразовывать между 16-24-32 битными я знаю...). 3ий день мучаюсь... Помогите кто чем может... хоть подскажите как мне их делить на эти части...
Заранее спасибо.

Забыл дописать... Без использования винапи и вообще без заморочек винды, т.к. ДОС и Вин не совместимы  Улыбаюсь
« Последнее редактирование: 16-12-2007 15:49 от Алексей1153++ » Записан
CAHTA
Гость
« Ответ #1 : 27-12-2005 21:10 » 

1. найди спецификацию формата.
2. вот что я когда то воял в инсте ...
   описывать не буду... разберешся сам Улыбаюсь)
Код:

 #include<conio.h>
 #include<process.h>
 #include<stdio.h>
 #include<dos.h>
 #include<stdlib.h>


int main(void)
{
   FILE *in,*out2,*out3, *out,*out4;
   int i;

   if ((in = fopen("C:\\ris8.bmp", "rb")) == NULL)
{
  fprintf(stderr, "Cannot open input file.\n");
  return 1;
}

   if ((out = fopen("C:\\ris8_R.bmp", "wb")) == NULL)
{
  fprintf(stderr, "Cannot open output file.\n");
  return 1;
}

   if ((out2 = fopen("C:\\ris8_G.bmp", "wb")) == NULL)
{
  fprintf(stderr, "Cannot open output file.\n");
  return 1;
}

   if ((out3 = fopen("C:\\ris8_B.bmp", "wb")) == NULL)
{
  fprintf(stderr, "Cannot open output file.\n");
  return 1;
}

   if ((out4 = fopen("C:\\ris8_RGB.bmp", "wb")) == NULL)
{
  fprintf(stderr, "Cannot open output file.\n");
  return 1;
}


for(int i=0;i<54;i++)
{
   char b=fgetc(in);
   fputc(b, out);
   fputc(b, out2);
   fputc(b, out3);
   fputc(b, out4);
}

i=1;
int nCount=0;
int R,G,B;
   while (!feof(in))
   {
     char b=fgetc(in);
     if(i==1)  {fputc(b, out); fputc(0, out2); fputc(0, out3); R=b;}
     if(i==2)  {fputc(0, out); fputc(b, out2); fputc(0, out3); G=b;}
     if(i==3)
     {
      i=0;
      fputc(0, out); fputc(0, out2); fputc(b, out3); B=b;
      int RGB=(R+G+B)/3;
      fputc(RGB, out4); fputc(RGB, out4); fputc(RGB, out4);
     }
     i++;
     nCount++;
   }

   fclose(in);
   fclose(out);
   fclose(out2);
   fclose(out3);
   fclose(out4);
   return 0;
}

Записан
acc15
Гость
« Ответ #2 : 29-12-2005 13:36 » 

это разбивает 32битный битмап на битмапы R,G,B каналов...
это явно не то что мне надо... Спецификация битмапа ?) в мсдн есть...
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines