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

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

19.10.2025, 16:05. Показов 1606. Ответов 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,150
Записей в блоге: 3
19.10.2025, 16:49
Доброго.
Если речь идет об прямоугольнике с простой заливкой, то задача вполне реализуемая. А вот если это именно изображение, то все сложно))))))...озвучиваю это потому, что писал функции обычного поворота изображения вокруг своей оси.

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

Про ИИ прям все трындят на всех форумах что творит чудеса, достаточно сказать что делать и все готово, комментарии только расставить ) сам не пробовал правда.
Например "преобразовать прямоугольное изображение в наклонную трапецию" )))
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
19.10.2025, 20:00
Цитата Сообщение от whale2 Посмотреть сообщение
сам не пробовал правда
"Съешь яблочко, узнаешь"(С)
0
 Аватар для Storm Screamer
4845 / 1412 / 115
Регистрация: 21.04.2013
Сообщений: 8,590
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
Сообщений: 227
20.10.2025, 00:45  [ТС]
Цитата Сообщение от Storm Screamer Посмотреть сообщение
Как проще не знаю, так как сначала надо хоть как-то сделать. А что делать пока не понятно.
По синусу конечно изгибать не надо, нужно изгибать на любой заданный угол в любой момент.
Угол изгибания задается координатами gps, те
идет сканирование местности, в какой то момент сканер начинает поворачивать например направо и с каким то радиусом
разворачивается и пересекает свою же предыдущею траекторию, те скан как бы завязывается в узел.
Угол поворота задается с каким то таймингом в каждый текущий момент.

Вот на рисунке представьте что зеленая линия это длинное изображение, на деле оно прямоугольное, но в реальности оно должно быть изогнуто как нарисовано.
Те со сканера идет прямоугольное изображение, его надо изогнуть как на рисунке.
Угол поворота получаем скажет через каждые 10 пикселей, всего 1600 пикселей.
Миниатюры
Как изогнуть изображение?  
0
 Аватар для Storm Screamer
4845 / 1412 / 115
Регистрация: 21.04.2013
Сообщений: 8,590
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
Сообщений: 227
20.10.2025, 12:09  [ТС]
Это ИИ написал ?
А это что такое не понял
trajectory.size() ? какая то функция /трехмерная структура / массив ?
Кстати при повороте там не прямоугольный треугольник получается а равнобедренный иначе изображение будет растягиваться.

Я так понимаю главное не перерисовать существующие точки и заполнить пустые места чем то.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
21.10.2025, 22:01
Цитата Сообщение от whale2 Посмотреть сообщение
Я так понимаю главное не перерисовать существующие точки и заполнить пустые места чем то.
Почему?
Такая операция явно будет искажать данные. Если добавить левые данные, например из справочника Потлочного, то искажения будут ещё больше.

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

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

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

Все это нужно чтобы правильно поворачивать сканы местности, тк ГИС очень хреново с этим справляется,
идея была самому все разворачивать а потом уже выводить на ГИС как прямоугольник.
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
22.10.2025, 00:55  [ТС]
По типу такого
Миниатюры
Как изогнуть изображение?  
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
22.10.2025, 11:36  [ТС]
Даже лучше придумал, делим изображение на вертикальные узкие прямоугольники и потом копируем по очереди их с нужным поворотом.
0
1968 / 824 / 115
Регистрация: 01.10.2012
Сообщений: 4,862
Записей в блоге: 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
Сообщений: 274
23.10.2025, 00:40
Триангуляция.

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

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

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

Добавлено через 1 минуту
Цитата Сообщение от Igor3D Посмотреть сообщение
А если писать код душа не лежит
Надо выработать стратегию поворота для начала тк вариантов несколько.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
23.10.2025, 21:00
Цитата Сообщение от whale2 Посмотреть сообщение
угол поворота не постоянен а меняется от каждого пикселя к пикселю.
Это как река извилистая и вода мокрая.
Так и повороты, непостоянные, меняются от поворота к повороту)

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

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

Эту трансформацию никак не выполнить на потоковых данных.(что читается у тебя между строк)
То есть, ещё раз проверь входные данные и что от тебя требуется.
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru