Я использую Java AWT для масштабирования изображения JPEG, для создания эскизов. Код работает нормально, если изображение имеет нормальный коэффициент выборки (2x2,1x1,1x1)Как масштабировать изображения JPEG с нестандартным коэффициентом выборки в Java?
Однако изображение с таким коэффициентом выборки (1x1, 1x1, 1x1) создает проблему при масштабировании. Цвета повреждаются, хотя функции распознаются.
original и миниатюра: alt text http://otherplace.in/thumb1.jpg
код, я использую это примерно эквивалентно:
static BufferedImage awtScaleImage(BufferedImage image,
int maxSize, int hint) {
// We use AWT Image scaling because it has far superior quality
// compared to JAI scaling. It also performs better (speed)!
System.out.println("AWT Scaling image to: " + maxSize);
int w = image.getWidth();
int h = image.getHeight();
float scaleFactor = 1.0f;
if (w > h)
scaleFactor = ((float) maxSize/(float) w);
else
scaleFactor = ((float) maxSize/(float) h);
w = (int)(w * scaleFactor);
h = (int)(h * scaleFactor);
// since this code can run both headless and in a graphics context
// we will just create a standard rgb image here and take the
// performance hit in a non-compatible image format if any
Image i = image.getScaledInstance(w, h, hint);
image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
g.drawImage(i, null, null);
g.dispose();
i.flush();
return image;
}
(код любезно this page)
Есть ли лучший способ сделать это?
Вот test image с коэффициентом выборки [1x1, 1x1, 1x1].
Я видел этот эффект при использовании 'ImageIO' для кодирования * полупрозрачного * изображения в формате JPEG, но я не думаю, что это относится к вашему примеру, поскольку ваше выходное изображение непрозрачно (' TYPE_INT_RGB'.) Является ли этот код образец завершен или есть другая пост-обработка, применяемая к изображению? Возможно непреднамеренное создание полупрозрачного изображения (например, 'AffineTransformOp' с' TYPE_BILINEAR 'добавит альфа-канал для сглаживания края полученного изображения, если он не лежит на точной границе пикселя.) – finnw