Генерация миниатюры с использованием BufferedImage без инвертирования цвета и усиления альфа в Java - PullRequest
0 голосов
/ 27 февраля 2019

Я использую 'BufferedImage' для создания миниатюры по этому коду.

try {
 BufferedImage bi = new BufferedImage(thumWidth, thumHeight, TYPE_INT_ARGB);
 Graphics2D g = bi.createGraphics();

 Image ii = (new ImageIcon(orgFile.getAbsolutePath())).getImage();

 g.drawImage(ii, 0, 0, thumWidth, thumHeight, null);
 String thumbFileDir = prefixPath + "/" + thumWidth + "/" + afterPath;
 File file = this.createPathIfnotexist(thumbFileDir);
 String fullPathToSave = this.genPath(file.getAbsolutePath(), fileName);
 File thumbFile = new File(fullPathToSave);
 ImageIO.write(bi, ext, thumbFile);
} catch (IOException var22) {
 var22.printStackTrace();
 return;
} catch (Exception var23) {
 var23.printStackTrace();
}

Моя проблема ...

  1. Когда я получаю экземпляр BufferedImage с TYPE_INT_RGB, потерять альфа при отправке файла PNG, и все нормально при отправке файла JPG. Оригинал , Конвертировано

  2. Когда я получаю экземпляр BufferedImage с TYPE_INT_ARGB, получить альфа при отправке файла PNG, но цвет при инверсии при передачеJPG файл. Оригинал , Конвертировано

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

1 Ответ

0 голосов
/ 27 февраля 2019

В результате моих дальнейших исследований я подумал, что было бы удобнее использовать внешнюю библиотеку , чем опробовать ее способом, предложенным в вопросе.

Итак,Я решил использовать java-image-scaling для создания эскиза.

Для тех, кто посетит эту страницу в будущем, я оставляю некоторый код.(На самом деле, вопрос был написан на Java, но ответ написан на Kotlin.)

imgLocation - это загруженный путь к исходному изображению, width - это контрольная точка, такая как 100, 240, 480, 720, 1080.

    private val rootLocation: Path by lazy { Paths.get(location) }
    private val formatNames = ImageIO.getWriterFormatNames().toList()

    override fun resizeImage(imgLocation: String, width: Int): File {
        val originFile = this.rootLocation.resolve(imgLocation).toFile()
        val destFile = this.rootLocation.resolve("resized-$width-${originFile.name}").toFile()

        val bufferedImage: BufferedImage = originFile.inputStream().use { ImageIO.read(it) }
        val resizeImage = if (width <= bufferedImage.width) {
            val nHeight = width * bufferedImage.height / bufferedImage.width
            val rescale = MultiStepRescaleOp(width, nHeight).apply { unsharpenMask = AdvancedResizeOp.UnsharpenMask.Soft }
            rescale.filter(bufferedImage, null)
        } else {
            bufferedImage
        }

        val target = if (formatNames.contains(destFile.extension)) destFile else File(destFile.path + ".jpg")
        ImageIO.write(resizeImage, target.extension, target)

        bufferedImage.flush()
        return destFile
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...