Как обрезать изображение с изменением размера в Java?

Когда я устанавливаю изображение с фактическим размером на панель и обрезаю его с помощью мыши, он работает нормально, но когда я изменяю размер изображения на панель и обрезаю, получается неправильное изображение обрезки. Как обрезать изображение для изменения размера с помощью мыши?

  int x = Math.min(p1.x, p2.x);
  int y = Math.min(p1.y, p2.y);
  int w = Math.abs(p1.x - p2.x);
  int h = Math.abs(p1.y - p2.y);
  BufferedImage dest = image.getSubimage(x,y,w,h)

Добро пожаловать в SO. Пожалуйста, возьмите тур и посмотрите Как мне задать хороший вопрос?.

c0der 03.10.2018 15:28
How to crop resize image using mouse? - так же, как вы кадрируете исходное изображение. but when i resize image onto panel Вам просто нужно убедиться, что вы ссылаетесь на "изменение размера" изображения, когда делаете кадрирование. Опубликуйте свой минимальный воспроизводимый пример, демонстрирующий проблему, если вам нужна дополнительная помощь.
camickr 03.10.2018 16:19

но я выбираю область из изменения размера изображения и обрезки из этого исходного изображения

shri shri 03.10.2018 20:10
cropping from that original image - это моя точка зрения. Не делай этого. Вам нужно обрезать изображение с измененным размером !!! Это изображение, которое теперь видно на панели. Если вы хотите обрезать исходное изображение, вам нужно будет вычислить масштабные коэффициенты x / y двух изображений. Затем вам нужно будет отрегулировать значения x / y / ширины / высоты с помощью этих масштабных коэффициентов.
camickr 03.10.2018 20:14

Спасибо, но я новичок в этом. Могу ли я предложить мне несколько примеров или руководств, связанных с этим?

shri shri 03.10.2018 20:38

@shrishri, Can suggest me some examples or tutorials related to this? - С чем связано? Я предлагаю два подхода: 1) который прост, поскольку вы просто сохраняете ссылку на изображение с измененным размером, чтобы вы могли его обрезать, если хотите, и 2) используйте базовую математику для расчета коэффициента масштабирования между исходным и измененным изображениями. В любом случае я уже предоставил более подробную информацию о втором подходе в своем ответе.

camickr 03.10.2018 20:49
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
6
820
1

Ответы 1

If you want to crop from the original image then you will need to calculate the x/y scale factors of the two images. Then you will need to adjust the x/y/width/height values by these scale factors.

Итак, если ваше исходное изображение имеет размер 400 x 100, а изображение с измененным размером - 100 x 100, вы должны сделать что-то вроде:

double xScale = originalImageWidth / resizeImageWidth = 400 / 100 = 4.

Итак, теперь, если прямоугольник обрезки на изображении с измененным размером равен (10, 10, 20, 30);

Затем вам нужно рассчитать свои значения примерно так:

int x = rectangle.x * xScale;
int width = rectangle.width * xScale;

image.getSubImage(x, y, width, height);

Очевидно, вам нужно будет рассчитать значения y / высоты, используя коэффициент масштабирования y.

с помощью этого метода я получаю неправильное изображение при обрезке, потому что я получаю значение масштабирования в точку, и когда я умножаю на x, y, w, h, оно принимает целочисленное значение, что означает, что зазор между точками дает неправильную обрезку.

shri shri 06.10.2018 14:51

Разместите свой минимальный воспроизводимый пример, демонстрирующий проблему. Понятия не имею, что ты делаешь.

camickr 06.10.2018 17:14

Другие вопросы по теме