powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Модификация bmp
6 сообщений из 6, страница 1 из 1
Модификация bmp
    #34235419
Товарищи, всех поздравляю с Новым Годом!!!!!

Есть задача.. не знаю даж как подойти к ее решению. Вот подумал, что мож у кого появятся светлые мысли.

Итак:
Есть исходный материал, представляющий собой граф. файлы в формате bmp. Получены они путем сканирования геологических карт. На этих картах нанесена координатная сетка. При сканировании изображение искажается и в итоге, линии сетки вовсе не параллельны/перпендикулярны, а как-то странно расположены под углом. Вместе с линиями сетки (понятно) искажаются и сами карты.

Так вот идея по "исправлению" этих файлов заключается в следующем:

В программу импортируется этот файл. Далее создается некая виртуальная сетка (какими-либо средствами разработки. не важно какими.) и накладывается на bmp файл. Далее узлы виртуальной сетки вручную совмещаются с узлами на файле. Далее сетка (уже "прицепленная" к файлу) востанавливает свое исходное состояние и вместе с этим расстягивает/сжимает/поворачивает/итд bmp файл, тем самым вроде как приводя его в нормальный вид. Как реализовать сетку, ее наложение и ручное совмещение, это я представляю, а вот как реальзовать модификацию BMP???? Вот в чем вопрос!

ПА-МА-ГИ-ТЕЕЕЕЕЕЕЕЕЕЕ!!!!!!!!!!!!!!!!
...
Рейтинг: 0 / 0
Модификация bmp
    #34235427
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Светлые мысли скорее всего появятся у людей, которые были связаны с ГИС. Наверняка у них эта проблема имела место.

2. Лично мне, кроме термина морфинг больше ничего в голову не приходит. IMHO можно с этого конца подойти к проблеме, хотя.. это может-быть и не самый быстрый путь.
...
Рейтинг: 0 / 0
Модификация bmp
    #34235481
гм.... а под морфингом имеется ввиду чего-то конкретное или как?
Справка словаря яндекса:
Морфинг — технология, позволяющая преобразовывать одно изображение в другое изображение с сохранением некоторых параметров...

Как ентон морфинг осуществить - вот ведь в чем загадка...
...
Рейтинг: 0 / 0
Модификация bmp
    #34235505
Фотография Палестинец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как реализовать сетку, ее наложение и ручное совмещение, это я представляю, а вот как реальзовать модификацию BMP????

Как реализовать растяжение/сжатие координат (x,y) представляешь?
BMP - это массив (x,y) с значением цвета в точке.. по полученной функции преобразования( "Как реализовать сетку, ее наложение и ручное совмещение, это я представляю" ) строишь преобразованную бмпшку..

Я пока вижу такие проблемы:
0) Функция растяжения задающаяся наложением сетки.

очевидно сетку можно разбить на кусочки (и считать что растяжение линейно по этим кусочкам)..

1) Совмещение пикселей разных цветов при сжатии - 2(и более) пикселей в один
2) Закраска пикселей при растяжении.
реализация этих 2 - это уже от твоей задачи зависит.
...
Рейтинг: 0 / 0
Модификация bmp
    #34237533
SnowMan2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда-то решал похожую задачу. Привожу код, может поможет. Сжимает, расширает и сдвигает.
Следует выставить опцию компилятора - выравнивание на байт.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
typedef struct rgb {
     BYTE b;
     BYTE g;
     BYTE r;
} rgb;

const     MaxX =  4060 , MaxY= 4700 ; // Размер картинки
rgb       a[MaxY][MaxX], b[MaxX];
int       x, y, 
int       x1= 135 , x2= 3985 , y1= 135 , y2= 4505 ,  // Угловые точки карты (не считая боковых полосок)
int       idx, idy;
double    dx, dx1=- 5 , dx2= 29 , dx3=- 9 , dx4= 54 ; // На сколько нужно сдвигать каждую из четырех 
                                                               // угловых точек
double    dy, dy1= 7 ,  dy2= 5 ,  dy3= 2 ,  dy4= 0 ;
char      Buf[ 1000 ];

void fun(void)
{
 int      n;
 FILE     *in, *out;

 in = fopen("na-40-81.bmp", "rb");
 if (in == NULL) {
     Application->MessageBox("Входной файл не открыт", "", MB_OK);
     return;
 } // if

 out = fopen("na40081.bmp", "wb");
 if (out == NULL) {
     Application->MessageBox("Выходной файл не открыт", "", MB_OK);
     return;
 } // if

 fread(Buf,  54 ,  1 , in);
 fread(a,  1 ,  3 *MaxX*MaxY, in);
 fwrite(Buf,  54 ,  1 , out);

 for (y=MaxY- 1 ; y>= 0 ; y--) {
     for (x =  0 ; x < MaxX; x++) {
          if (x% 100  ==  0 ) {
               b[x].r =  0 ;
          } // if
          dx = (dx4*(x-x1)*(y-y1))/((x2-x1)*(y2-y1)) +
               (dx3*(x-x2)*(y-y1))/((x1-x2)*(y2-y1)) +
               (dx2*(x-x1)*(y-y2))/((x2-x1)*(y1-y2)) +
               (dx1*(x-x2)*(y-y2))/((x1-x2)*(y1-y2));
          dy = (dy4*(x-x1)*(y-y1))/((x2-x1)*(y2-y1)) +
               (dy3*(x-x2)*(y-y1))/((x1-x2)*(y2-y1)) +
               (dy2*(x-x1)*(y-y2))/((x2-x1)*(y1-y2)) +
               (dy1*(x-x2)*(y-y2))/((x1-x2)*(y1-y2));
          idx = dx;
          idy = dy;
          if (x+idx< 0  || x+idx>=MaxX || y+idy< 0  || y+idy>=MaxY) {
               b[x].r =  0 ;
               b[x].g =  0 ;
               b[x].b =  0 ;
          } else {
               b[x].r = a[MaxY- 1 -y-idy][x+idx].r;
               b[x].g = a[MaxY- 1 -y-idy][x+idx].g;
               b[x].b = a[MaxY- 1 -y-idy][x+idx].b;
          } // else
     } // for
     fwrite(b,  1 ,  3 *MaxX, out);
 } // for

 fclose(in);
 fclose(out);
}
...
Рейтинг: 0 / 0
Модификация bmp
    #34237617
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я-бы вынес вычисления с константами за границы цикла. Думаю, так можно получить бонус в виде увеличения скорости линейного преобразования. Правда цифр конкрентых не знаю. Это надо проверять экспериментально.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
double v1= 1 . 0 /(x2-x1)*(y2-y1);
double v2= 1 . 0 /(x1-x2)*(y2-y1);
double v3= 1 . 0 /(x2-x1)*(y1-y2);
double v4= 1 . 0 /(x1-x2)*(y1-y2);

for (y=MaxY- 1 ; y>= 0 ; y--) {
     for (x =  0 ; x < MaxX; x++) {
          if (x% 100  ==  0 ) {
               b[x].r =  0 ;
          } // if
          dx = v1*(dx4*(x-x1)*(y-y1)) +
               v2*(dx3*(x-x2)*(y-y1)) +
               v3*(dx2*(x-x1)*(y-y2)) +
               v4*(dx1*(x-x2)*(y-y2));
          dy = v1*(dy4*(x-x1)*(y-y1)) +
               v2*(dy3*(x-x2)*(y-y1)) +
               v3*(dy2*(x-x1)*(y-y2)) +
               v4*(dy1*(x-x2)*(y-y2));
          idx = dx;
          idy = dy;
          if (x+idx< 0  || x+idx>=MaxX || y+idy< 0  || y+idy>=MaxY) {
               b[x].r =  0 ;
               b[x].g =  0 ;
               b[x].b =  0 ;
          } else {
               b[x].r = a[MaxY- 1 -y-idy][x+idx].r;
               b[x].g = a[MaxY- 1 -y-idy][x+idx].g;
               b[x].b = a[MaxY- 1 -y-idy][x+idx].b;
          } // else
     } // for
     fwrite(b,  1 ,  3 *MaxX, out);
 } // for

P.S. Можно избавиться от нескольких разностей в числителе, если изменить границы цикла ИМХО.

P.P.S. Проклятая привычка всё оптимизировать! Рррррр!
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Модификация bmp
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]