2010-07-22 2 views
2

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

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, но это не интересно (по крайней мере, не сейчас).

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

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

Спасибо.

+0

Вы не можете обрезать изображение сначала, чтобы удалить расточные биты? – willcodejavaforfood

+0

Хорошая идея, но это испортит диапазон осей, который определяется как метры. Кроме того, изображения будут отличаться, поэтому для всех, кого я знаю, могут быть ценные пиксели также сверху/снизу. –

+0

Я не уверен в этом, но вы не могли бы уменьшить альфах фоновых пикселей, чтобы они меньше подсчитывали при интерполяции? –

ответ

2

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

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

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

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

+0

Думаю, я попробую. Благодаря! –

Смежные вопросы