java - 控制图像缩放算法
问题描述
我正在尝试在 JavaFX 中重写 Swing 图像查看器,但是 JavaFX Image 构造函数使用的缩放算法质量非常低。不幸的是,我不得不依靠在构造函数中调整图像的大小,因为有些图片太大而无法完全加载到 JavaFX 的内存中(即使它曾经在 Swing 中工作)。
这是一个比较。在左侧,BufferedImage.drawImage
用于缩小图片并使用Graphics.drawImage
in paintComponent
(使用抗锯齿渲染提示)进行渲染,在右侧,通过 JavaFX Image 构造函数以相同的缩小分辨率加载相同的图片(smooth 设置为 true)。
如您所见,JavaFX 缩减算法引入了一种锯齿效应。我该如何补救?我想问题出在图像没有完全加载到内存中,但似乎我别无选择。
这是一个将生成比较的代码。以下图为例。
public static BufferedImage scale(BufferedImage img, int width, int height) {
int imageType = (img.getTransparency() == Transparency.OPAQUE)
? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB;
BufferedImage scaled = new BufferedImage(width, height, imageType);
Graphics2D context = scaled.createGraphics();
context.setRenderingHint(
RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
context.drawImage(img, 0, 0, width, height, null);
context.dispose();
return scaled;
}
@Override
public void start(Stage stage) {
// Load full image in memory, downscale using BufferedImage
Image image1 = new Image("file:4000x3600.jpg");
BufferedImage bimg = SwingFXUtils.fromFXImage(image1, null);
bimg = scale(bimg, 600, 600);
image1 = SwingFXUtils.toFXImage(bimg, null);
// Downscale in the Image constructor, saves memory
Image image2 = new Image("file:4000x3600.jpg", 600, 600, false, true);
AnchorPane root = new AnchorPane();
ImageView view1 = new ImageView(image1);
view1.setLayoutX(0.0);
view1.setLayoutY(0.0);
ImageView view2 = new ImageView(image2);
view2.setLayoutX(600.0);
view2.setLayoutY(0.0);
root.getChildren().add(view1);
root.getChildren().add(view2);
Scene scene = new Scene(root, 1200, 600);
stage.setScene(scene);
stage.show();
}
解决方案
推荐阅读
- python - python azure函数中的错误404 HEAD依赖
- microservices - 面向微服务架构中的外键约束
- typescript - Formik React-Native - 如何在对象数组中的每个字段上显示 Yup 验证错误
- python - 从 Excel 到日期时间变量的日期字符串
- ios - Xcode:您的会话已过期。请登录。尝试重新登录或联系苹果开发者支持解决帐户访问问题
- python - Model.evaluate 准确度和 keras 控制台准确度与 sklearn 指标不匹配
- angular - 我如何正确地将串行端口/解析器分隔符实现到电子/角度
- html - 我在 Angular 上的网站右侧的空白区域
- php - PHP - 使用数组通用元素创建表
- python - 每 3 个字符分隔字符串并将它们放在一个列表中