java - 如何在不丢失纵横比的情况下将图像放入 Shape 中?
问题描述
我想从计算机中挑选图像并将其放入圆形(JavaFX)中,但它不断将纵横比更改为 1:1,我不知道该怎么做,也许还有另一种方法可以做到,但我没有知道很多JavaFX,我在这里没有找到其他任何东西。
拥有此图像,纵横比为 4:3,它将纵横比更改为 1:1 (this)。
这是“onClick”方法的代码:
@FXML
public void handleUploadImage(MouseEvent event) {
FileChooser fileChooser = new FileChooser();
//Extensiones soportadas de imagen
FileChooser.ExtensionFilter extFilterjpg
= new FileChooser.ExtensionFilter("jpg files (*.jpg)", "*.jpg");
FileChooser.ExtensionFilter extFilterpng
= new FileChooser.ExtensionFilter("png files (*.png)", "*.png");
FileChooser.ExtensionFilter extFilterjpeg
= new FileChooser.ExtensionFilter("jpeg files (*.jpeg)", "*.jpeg");
fileChooser.getExtensionFilters().addAll(extFilterjpg, extFilterpng, extFilterjpeg);
//Menu de seleccion de imagen
File file = fileChooser.showOpenDialog(null);
Image image = new Image(file.toURI().toString());
circleImage.setFill(new ImagePattern(image, circleImage.getCenterX()-circleImage.getRadius(), circleImage.getCenterY()-circleImage.getRadius(), 2*circleImage.getRadius(), 2*circleImage.getRadius(), false)); //circleImage.setFill(new ImagePattern(image)); -> do the exact same thing
}
解决方案
我看到了 2 个解决方案,可能不像您预期的那么容易。
1-首先创建一个正方形的居中图像
Image square(Image img) {
if (img.getHeight() == img.getWidth()) {
return img;
}
// Smallest length
int size = (int) (img.getWidth() > img.getHeight() ? img.getHeight() : img.getWidth());
// left shift
int x = ((int) img.getWidth() - size) / 2;
// top shift
int y = ((int) img.getHeight() - size) / 2;
return new WritableImage(img.getPixelReader(), x, y, size, size);
}
并按原样绘制。
2-将图像画在圆圈外一点
ImagePattern pattern(Image img, double radius) {
double hRad = radius; // horizontal "radius"
double vRad = radius; // vertical "radius"
if (img.getWidth() != img.getHeight()) {
double ratio = img.getWidth() / img.getHeight();
if (ratio > 1) {
// Width is longer, left anchor is outside
hRad = radius * ratio;
} else {
// Height is longer, top anchor is outside
vRad = radius / ratio;
}
}
return new ImagePattern(img, -hRad, -vRad, 2 * hRad, 2 * vRad, false);
}
推荐阅读
- react-native - 在 React Native 中按下回车时如何禁用在多行 TextInput 中插入新行
- jquery - align button on the right side
- java - 执行/测试一个类
- javascript - React 测试 [Jest] 问题 - 需要域选项
- javascript - 为什么检测到文件更改时 webpack 没有运行所有插件?
- php - 将文件上传到php中的目录
- swift - 无法将字体大小缩放到框架的高度/宽度
- html - 如何在打字稿文件的一组单选按钮中选择特定的单选按钮?
- python - 抓取中的python HTML自定义标签
- c# - 解析 JWT 令牌以仅在 C# 或 Blazor 中没有外部库的情况下获取有效负载内容