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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.05.2012, 17:12   #1
Alendorff
Форумчанин
 
Аватар для Alendorff
 
Регистрация: 04.06.2011
Сообщений: 104
По умолчанию С++, BMP-файлы, растянуть в два раза изображение.

Здравствуйте.
Нужна помощь.
Задача: растянуть изображение по оси Y в два раза (новые значения в строке, находятся как средние арифметические от двух известных - обрамляющих).
У меня считан в двумерный массив BMP файл следующим образом:

Цитата:
int x=w*h;
int l=3;
unsigned char** color=new unsigned char*[x];
for (int i=0;i<x;i++)
color[i]=new unsigned char[l];
int s=54;
fseek(f,s,SEEK_SET);
for (int i=0; i<(w*h); i++)
{for (int g=0; g<3; g++)
{
fread(&color[i][g],1,1,f);
}
}
Это кусочек кода, чтобы было понятно, как выглядит массив с изображением, w, h, l это ширина, высота, кол-во цветов (R G B) соответственно.

Как изображение растянуть?

Последний раз редактировалось Alendorff; 20.05.2012 в 17:16.
Alendorff вне форума Ответить с цитированием
Старый 20.05.2012, 23:01   #2
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Что вам мешает создать ещё один массив с шириной в 2 раза больше?
И с конца записывать вместо одного пикселя два пикселя.
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 21.05.2012, 06:33   #3
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Взгляните сюда. Возможно поможет.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 21.05.2012, 11:16   #4
Alendorff
Форумчанин
 
Аватар для Alendorff
 
Регистрация: 04.06.2011
Сообщений: 104
По умолчанию

Цитата:
Сообщение от Rin Посмотреть сообщение
Что вам мешает создать ещё один массив с шириной в 2 раза больше?
И с конца записывать вместо одного пикселя два пикселя.
Задание. Нужно среднее от обрамляющих.
Alendorff вне форума Ответить с цитированием
Старый 21.05.2012, 11:27   #5
Alendorff
Форумчанин
 
Аватар для Alendorff
 
Регистрация: 04.06.2011
Сообщений: 104
По умолчанию

Я немного проворонил, что нужно растягивать вверх :D и растягивал по оси X, ну принцип один и тот же, только некоторые изменения нужно сделать. Да не важно, в общем решил растянуть по оси X в два раза. Вот кусочек кода:

Код:
typedef unsigned char vec3ub[3];
/*
...
*/
   int wb=w1*3; //w1 - ширина исходного файла.
  while(wb%4!=0)  //ширина должна быть кратна четырём
  {
   wb=wb+1;   //ширина в байтах
  }
int x=w1*h;
vec3ub* temp=new vec3ub[w1+1]; // под мусор
vec3ub* img1=new vec3ub[x]; 
fseek(f,sm,SEEK_SET); /*f - файл изображения img1, sm - смещение 54 заголовка bmp файла*/
   for (int i=0; i<h; i++){
     fread(temp,wb,1,f);
     for (int j=0; j<w1; j++){
     img1[i*w1+j][0]=temp[j][0];
     img1[i*w1+j][1]=temp[j][1];
     img1[i*w1+j][2]=temp[j][2];
   }
   }        //Считали весь массив в файл

  int w2;
  w2=(w1*2);    //новое изображение вдвое больше по ширине
     while(w2%4!=0)
  {
   w2=w2+1;
  }
  x=w2*h;
   vec3ub* img2=new vec3ub[x]; //Массив под новое изображение
for (int i=0; i<h; i++){   //записываем старое изображение через один столбец
  for (int j=0; j<w1;j++){
    img2[i*w2+j*2][0]=img1[i*w1+j][0];
    img2[i*w2+j*2][1]=img1[i*w1+j][1];
    img2[i*w2+j*2][2]=img1[i*w1+j][2];
  }
}
for (int i=0; i<h; i++){
  for (int j=0; j<w1; j++){
    if (j!=w1-1){
      img2[i*w2+j*2+1][0]=(img2[i*w2+j*2][0]+img2[i*w2+(j+1)*2][0])/2;
      img2[i*w2+j*2+1][1]=(img2[i*w2+j*2][1]+img2[i*w2+(j+1)*2][1])/2;
      img2[i*w2+j*2+1][2]=(img2[i*w2+j*2][2]+img2[i*w2+(j+1)*2][2])/2;
    }
    else {
    img2[w2][0]=img1[w2-1][0];
    img2[w2][1]=img1[w2-1][1];
    img2[w2][2]=img1[w2-1][2];
    }
  }
}
/*
...
*/

  fseek(f,54,SEEK_SET);
  for (int i=0; i<w2*h; i++)
  {
    fwrite(&img2[i][0],1,1,z);
    fwrite(&img2[i][1],1,1,z);
    fwrite(&img2[i][2],1,1,z);
  }
/*
...
*/

Последний раз редактировалось Alendorff; 21.05.2012 в 11:32.
Alendorff вне форума Ответить с цитированием
Старый 21.05.2012, 11:29   #6
Alendorff
Форумчанин
 
Аватар для Alendorff
 
Регистрация: 04.06.2011
Сообщений: 104
По умолчанию

А вообще я не очень понимаю эти приколы с мусором и массивом temp, мне так преподаватель сказал сделать...
Alendorff вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как растянуть изображение? Pasha_a HTML и CSS 0 28.01.2010 16:37
два раза к одной таблице Kolik317 SQL, базы данных 2 26.12.2009 13:58
слово пишется два раза INDY-SAVER Microsoft Office Word 2 18.11.2009 23:49