Как сохранить / одобрить определенные значения пикселей при изменении размера BufferedImage? - PullRequest
2 голосов
/ 22 июля 2010

У меня есть BufferedImage, которое довольно высокое (что-то вроде высоты 1100 пикселей) и не особенно широкое (возможно, 200-300 пикселей). Изображение состоит из графика данных, но большинство пикселей представляет цвет / значение фона, которое не очень интересно. Моя проблема заключается в том, что когда размер изображения изменяется с высоты 1100 пикселей до примерно 200-300 пикселей, многие пиксели, которые на самом деле содержали интересные данные, удаляются пикселями цвета фона. Есть ли какой-нибудь способ сказать алгоритмам 2D-масштабирования Java, что я предпочитаю пиксели с определенными значениями (или, лучше, что я хочу уменьшить приоритетность цвета фона) при изменении масштаба? Я использую следующий фрагмент кода для изменения масштаба изображения:

BufferedImage resized = new BufferedImage(width, height, imageType);
Graphics2D graphics2D = resized.createGraphics();
graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); //Has worked best in my case
graphics2D.drawImage(source, 0, 0, width, height, null);
graphics2D.dispose();

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

Как-то скучно то, что раньше я использовал библиотеку (которая больше не будет использоваться), которой действительно удалось сохранить большую часть ценных данных, представляющих пиксели.

Обратите внимание, что у меня есть необработанные данные о пикселях (двумерный массив int), если это поможет. Приложение будет обрабатывать множество изображений разных размеров, поэтому я не знаю точно, что высота обязательно составляет 1100 пикселей.

Спасибо.

1 Ответ

2 голосов
/ 22 июля 2010

Вы пробовали включить сглаживание в подсказках рендеринга?Это может помочь.

Если нет, вы можете довольно легко написать свою собственную функцию масштабирования.Это на самом деле довольно просто - вам просто нужно:

  • Цикл по всем точкам в вашей цели BufferedImage
  • Для каждого из этих циклов по соответствующим точкам в ваших необработанных данных пикселей (это будет прямоугольная зона, определяемая вашим коэффициентом масштабирования)
  • Рассчитайте целевой цвет, используя формулу по вашему выбору на основе необработанных значений пикселей
  • Используйте BufferedImage.setRGB (...) дляустановить цвет целевого пикселя

Нормальное сглаживание будет использовать что-то вроде среднего значения исходного пикселя в качестве формулы, звучит так, как будто вы хотите что-то, что дает приоритет определенным значениям (например, взятьмаксимальное значение пикселя, если фоновые пиксели имеют низкие значения цвета)

...