Масштабирование изображений GIF с прозрачным цветом должно работать нормально. Я согласен с jarnbjo, что проблема, скорее всего, в поколении bufferedThumb.
Может быть, помогут следующие подсказки:
1) При создании большого пальца скопируйте тип изображения из источника, например ::100100
BufferedImage thumb = new BufferedImage(fit, fit, image.getType());
2) Использовать 2D-подход:
Graphics2D g = thumb.createGraphics();
Вот пример кода для простого создания большого пальца (проверено и работает; прозрачность GIF, большой палец сохраняет прозрачность):
public static BufferedImage thumb(BufferedImage image, int fit) {
//image = blur(image);
BufferedImage thumb = new BufferedImage(fit, fit, image.getType());
Graphics2D g = thumb.createGraphics();
try {
int width = image.getWidth();
int height = image.getHeight();
int sx1;
int sy1;
int sx2;
int sy2;
int tmp;
if (height > width) {
tmp = height - width;
sx1 = 0;
sy1 = tmp / 2;
sx2 = width;
sy2 = height - sy1;
} else if (width > height) {
tmp = width - height;
sx1 = tmp / 2;
sy1 = 0;
sx2 = width - sx1;
sy2 = height;
} else {
sx1 = 0;
sy1 = 0;
sx2 = width;
sy2 = height;
}
g.drawImage(
image,
0, 0,
fit, fit,
sx1, sy1,
sx2, sy2,
null
);
} finally {
g.dispose();
}
return thumb;
}//thumb
Примечание: под простым я подразумеваю, что он не даст качественных результатов, если вы пытаетесь слишком сильно масштабировать за один шаг (например, 2048 пикселей на входе, 100 пикселей на выходе). Возможно, вам потребуется многошаговый подход, и, вероятно, вам следует использовать AffineTransformOp с подсказками вместо использования графического устройства.