Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 221

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

19.10.2025, 16:05. Показов 1494. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть длинное прямоугольное изображение и его надо изогнуть на нужный угол, те сделать его волнистым по определенному закону, чтобы например изображение изогнулось и пересекло само себя и подобное,
как такое сделать проще ?
Я так понимаю вся суть это преобразовать вертикальный прямоугольник в наклонную трапецию.

Добавлено через 58 минут
Интересно если дать задачу какому нить ИИ написать код, например тому же supermaven ?
В сях напишет ?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.10.2025, 16:05
Ответы с готовыми решениями:

Вывести множество цифр, входящих в изображение числа N, которые не входят в изображение числа M
Помогите пожалуйста Сама задача " Пусть заданы два натуральных числа N и M. Составить программу,...

Отрисовка изображения поверх канвы (изображения) и вращение изображения
Здравствуйте. Столкнулся с 2умя проблемами при работе с изображениями средствами C++ Builder....

Изменение яркости контрастности изображения. Бинаризация изображения
Товарищи программисты помогите с разработкой алкоритма для изменеие яркости контрастности...

23
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,142
Записей в блоге: 3
19.10.2025, 16:49
Доброго.
Если речь идет об прямоугольнике с простой заливкой, то задача вполне реализуемая. А вот если это именно изображение, то все сложно))))))...озвучиваю это потому, что писал функции обычного поворота изображения вокруг своей оси.

Добавлено через 1 минуту
Цитата Сообщение от whale2 Посмотреть сообщение
В сях напишет ?
Маловероятно
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 221
19.10.2025, 16:54  [ТС]
Цитата Сообщение от Dinkin Посмотреть сообщение
А вот если это именно изображение
Конечно это изображение, про однотоновый прямоугольник бы не спрашивал.
Ну в принципе как я предлагал можно преобразовывать прямоугольник в наклонную трапецию а недостающие точки вычислять по соседним, но это решение в лоб.
Разбиваем весь поворот на кучу мелких повернутых трапеций и вуаля.

Про ИИ прям все трындят на всех форумах что творит чудеса, достаточно сказать что делать и все готово, комментарии только расставить ) сам не пробовал правда.
Например "преобразовать прямоугольное изображение в наклонную трапецию" )))
0
Заблокирован
19.10.2025, 20:00
Цитата Сообщение от whale2 Посмотреть сообщение
сам не пробовал правда
"Съешь яблочко, узнаешь"(С)
0
 Аватар для Storm Screamer
4835 / 1402 / 115
Регистрация: 21.04.2013
Сообщений: 8,563
19.10.2025, 23:49
Цитата Сообщение от whale2 Посмотреть сообщение
как такое сделать проще ?
Как проще не знаю, так как сначала надо хоть как-то сделать. А что делать пока не понятно.

Пример "волновой изгиб":
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void WaveDistort(Graphics::TBitmap* src, Graphics::TBitmap* dst, double amp, double freq) {
    src->PixelFormat = pf24bit;
    dst->SetSize(src->Width, src->Height);
    dst->PixelFormat = pf24bit;
 
    for (int y = 0; y < src->Height; y++) {
        BYTE* srcLine = (BYTE*)src->ScanLine[y];
        BYTE* dstLine = (BYTE*)dst->ScanLine[y];
        int shift = (int)(amp * sin(freq * y));
 
        for (int x = 0; x < src->Width; x++) {
            int sx = x - shift;
            if (sx >= 0 && sx < src->Width) {
                dstLine[x*3 + 0] = srcLine[sx*3 + 0];
                dstLine[x*3 + 1] = srcLine[sx*3 + 1];
                dstLine[x*3 + 2] = srcLine[sx*3 + 2];
            } else {
                dstLine[x*3] = dstLine[x*3+1] = dstLine[x*3+2] = 255; // белый фон
            }
        }
    }
}
Вызов:
C++
1
2
WaveDistort(originalBitmap, distortedBitmap, 30.0, 0.05);
Image1->Picture->Bitmap = distortedBitmap;
2
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 221
20.10.2025, 00:45  [ТС]
Цитата Сообщение от Storm Screamer Посмотреть сообщение
Как проще не знаю, так как сначала надо хоть как-то сделать. А что делать пока не понятно.
По синусу конечно изгибать не надо, нужно изгибать на любой заданный угол в любой момент.
Угол изгибания задается координатами gps, те
идет сканирование местности, в какой то момент сканер начинает поворачивать например направо и с каким то радиусом
разворачивается и пересекает свою же предыдущею траекторию, те скан как бы завязывается в узел.
Угол поворота задается с каким то таймингом в каждый текущий момент.

Вот на рисунке представьте что зеленая линия это длинное изображение, на деле оно прямоугольное, но в реальности оно должно быть изогнуто как нарисовано.
Те со сканера идет прямоугольное изображение, его надо изогнуть как на рисунке.
Угол поворота получаем скажет через каждые 10 пикселей, всего 1600 пикселей.
Миниатюры
Как изогнуть изображение?  
0
 Аватар для Storm Screamer
4835 / 1402 / 115
Регистрация: 21.04.2013
Сообщений: 8,563
20.10.2025, 01:14
C++
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
// Предположим: src — исходное изображение (W x H)
// trajectory.size() == src->Height
 
for (int i = 0; i < src->Height; i++) {
    double x = trajectory[i].x;
    double y = trajectory[i].y;
    double theta = trajectory[i].heading;
 
    double cosT = cos(theta);
    double sinT = sin(theta);
 
    // Нормаль (влево от направления движения)
    double nx = -sinT;
    double ny =  cosT;
 
    for (int u = 0; u < src->Width; u++) {
        double local_u = (u - src->Width / 2.0);
        double wx = x + local_u * nx;
        double wy = y + local_u * ny;
 
        int px = (int)(wx - minX + 50);
        int py = (int)((maxY - wy) + 50); // инверсия Y
 
        if (px >= 0 && px < result->Width && py >= 0 && py < result->Height) {
            // Получаем цвет из src->ScanLine[i][u]
            BYTE* srcLine = (BYTE*)src->ScanLine[i];
            BYTE* dstLine = (BYTE*)result->ScanLine[py];
 
            dstLine[px * 3 + 0] = srcLine[u * 3 + 0]; // B
            dstLine[px * 3 + 1] = srcLine[u * 3 + 1]; // G
            dstLine[px * 3 + 2] = srcLine[u * 3 + 2]; // R
        }
    }
}
2
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 221
20.10.2025, 12:09  [ТС]
Это ИИ написал ?
А это что такое не понял
trajectory.size() ? какая то функция /трехмерная структура / массив ?
Кстати при повороте там не прямоугольный треугольник получается а равнобедренный иначе изображение будет растягиваться.

Я так понимаю главное не перерисовать существующие точки и заполнить пустые места чем то.
0
Заблокирован
21.10.2025, 22:01
Цитата Сообщение от whale2 Посмотреть сообщение
Я так понимаю главное не перерисовать существующие точки и заполнить пустые места чем то.
Почему?
Такая операция явно будет искажать данные. Если добавить левые данные, например из справочника Потлочного, то искажения будут ещё больше.

Почему не растягивать изображение по каждой линии?
Как в обычном масштабировании изображения?
Осталось решить сколько точек изображения брать для растягивания.
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 221
22.10.2025, 00:16  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Если добавить левые данные
Зачем левые, среднее из крайних добавляется, просто это нужно все писать.

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

И вообще без треугольников, просто берем часть изображения и через CopyRect
копируем его в новые координаты, повернутые на нужный угол,
потом сдвигаемся на нужное кол-во пикселей и опять остаток
копирует в следующие координаты.

Все это нужно чтобы правильно поворачивать сканы местности, тк ГИС очень хреново с этим справляется,
идея была самому все разворачивать а потом уже выводить на ГИС как прямоугольник.
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 221
22.10.2025, 00:55  [ТС]
По типу такого
Миниатюры
Как изогнуть изображение?  
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 221
22.10.2025, 11:36  [ТС]
Даже лучше придумал, делим изображение на вертикальные узкие прямоугольники и потом копируем по очереди их с нужным поворотом.
0
1963 / 819 / 114
Регистрация: 01.10.2012
Сообщений: 4,771
Записей в блоге: 2
23.10.2025, 00:08
Цитата Сообщение от whale2 Посмотреть сообщение
Есть длинное прямоугольное изображение и его надо изогнуть на нужный угол, те сделать его волнистым по определенному закону,
Из того что на последнем скриншоте, псевдокод

angle - полный угол поворота в радианах (по скриншоту d2r(75))
cntr - центр поворота в пикселях (по скриншоту (0, 10))

Вычисляем размер нового имеджа

x_size_new = y_size_old + cntr.y
y_size_new = (y_size_old + cntr.y) * (1.0 + sin(angle))

Основной цикл: проходим "по углу" строка за строкой, ищем какая точка исходного соответствует новой. Псевдокод

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
for (int y = 0; y < y_size_old; ++y) {
  float radius = cntr.y + y;
  float arcLen = radius * angle + 1;  
  for (int x = 0; x < arcLen; ++x) {
   float x_f = x / arcLen;
   float cur_angle = x_f * angle;
   float sinA = sin(cur_angle);
   float cosA = cos(cur_angle);
 
// исходный пиксель
   float x_old = x_f * x_size_old;
   Color color = GetPixelAverage(x_old, y, arcLen / x_size_old);
 
// новый пиксель
   float x1 = 0.0f, y1 = -1.0f;
   float x_new = x1 * cosA - y1 * sinA + cntr.x;
   float y_new = cntr.y - (x1 * sinA + y1 * sinA);
 
   DrawPixel(x_new, y_new, color);
  }
}
К сожалению, GetPixelAverage тоже не прост. Ничего сложного, но возни порядочно. Поэтому если устроит с прямоугольниками - хорошо
0
 Аватар для MallSerg
91 / 58 / 14
Регистрация: 16.11.2018
Сообщений: 269
23.10.2025, 00:40
Триангуляция.

Так делают в 3D разбивают что то на треугольники после этого над ними легко выполняются линейные преобразования.
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 221
23.10.2025, 12:25  [ТС]
Цитата Сообщение от MallSerg Посмотреть сообщение
Триангуляция.
Это как из пушки по воробьям, слишком сложно для такой задачи.

Добавлено через 51 секунду
Цитата Сообщение от Igor3D Посмотреть сообщение
по скриншоту
А где скриншот ?
0
1963 / 819 / 114
Регистрация: 01.10.2012
Сообщений: 4,771
Записей в блоге: 2
23.10.2025, 17:30
Цитата Сообщение от whale2 Посмотреть сообщение
А где скриншот ?
Ваш пост #11.

А если писать код душа не лежит - можно воспользоваться инструментом деформаций, он практически одинаков в любом 3D приложении (аттач)
Миниатюры
Как изогнуть изображение?  
1
Заблокирован
23.10.2025, 18:46
Цитата Сообщение от Igor3D Посмотреть сообщение
аттач
Цитата Сообщение от SmallEvil Посмотреть сообщение
Почему не растягивать изображение по каждой линии?
Спасибо за то что сделал за меня скриншоты.
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 221
23.10.2025, 19:42  [ТС]
Цитата Сообщение от Igor3D Посмотреть сообщение
приложении (аттач)
В вашем варианте я так понимаю надо поворачивать все изображение, а
в моем с прямоугольниками только нужные прямоугольники тк
угол поворота не постоянен а меняется от каждого пикселя к пикселю.

Добавлено через 1 минуту
Цитата Сообщение от Igor3D Посмотреть сообщение
А если писать код душа не лежит
Надо выработать стратегию поворота для начала тк вариантов несколько.
0
Заблокирован
23.10.2025, 21:00
Цитата Сообщение от whale2 Посмотреть сообщение
угол поворота не постоянен а меняется от каждого пикселя к пикселю.
Это как река извилистая и вода мокрая.
Так и повороты, непостоянные, меняются от поворота к повороту)

Тут где то логическая несостыковка, если до такого скатилось.
И это где то в ТЗ.

Добавлено через 6 минут
whale2, ты хоть когда то видел трансформацию статического тела с угловым поворотом?
Что это за процесс?
То что на изображениях от известного коня стендапера Igor3D, это лишь раздумия на тему.
На самом деле это совсем другое.
Если нужно не повернуть(что само собой очевидно), а трансформировать с поворотом, то это совсем другая операция.
Это значит что одна сторона будет ужиматься у противоположная растягиваться.
И никакое
Цитата Сообщение от whale2 Посмотреть сообщение
делим изображение на вертикальные узкие прямоугольники и потом копируем по очереди их с нужным поворотом.
или другое из твоих соображений не прокатит.

Эту трансформацию никак не выполнить на потоковых данных.(что читается у тебя между строк)
То есть, ещё раз проверь входные данные и что от тебя требуется.
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 221
24.10.2025, 00:05  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
не прокатит
Почему ж, прокатит, просто заполняем пустые пиксели средними от краев.
Можно взять вообще прямоугольник в 1-2 пикселя,
см рисунок, белые области заполняем средними значениями.
Просто функция копирования области будет работать быстрее чем рисовать попиксельно.
Нет тут никаких потоковых данных, не додумывайте то чего нет.
Все что нужно я описал.
Миниатюры
Как изогнуть изображение?  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.10.2025, 00:05
Помогаю со студенческими работами здесь

Загрузка изображения в Image с сохранении соотношения сторон изображения
загрузка изображения в Image(с фиксированным размером) при этом изображение должно сохранить...

Как сделать окно (окно домика) в пространстве, как на изображении?
Здравствуйте, как сделать окно в пространстве, как на изображении? сделал крышу и &quot;фундамент&quot;: ...

Как получить изображение с веб-камеры
Помогите, как получить изображение с веб-камеры через билдер, а то я хочу сделать веб-камерный...

Как сохранить изображение в файл?
Подскажите, плиз, как сохранить изображение в файл, после того, как ты загрузил его LoadImage и...

Изображение, как поле класса
Подскажите пожалуйста как можно объявить изображение в классе, чтобы, допустим, при инициализации...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru