我使用“ 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();
}
我的问题是...
当我使用TYPE_INT_RGB
获取BufferedImage实例时,发送PNG文件时丢失alpha,发送JPG文件时也可以。 Original,Converted
当我使用TYPE_INT_ARGB
获取BufferedImage实例时,在发送PNG文件时获得alpha,但是在发送JPG文件时颜色却相反。 Original,Converted
因此,我想创建缩略图而不反转颜色并保持alpha。我该怎么办?
答案 0 :(得分:0)
作为我不断研究的结果,我认为使用外部库比以问题中建议的方式进行尝试更方便。
因此,我决定使用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
}