在CodenameOne中调整照片大小而不丢失正确的尺寸

3
我正在使用以下代码捕获照片
m_photoFile = Capture.capturePhoto(1920, -1);

CN1没有强制限制1920宽度大小,至少在安卓手机上是如此。因此,我需要手动调整并存储图像以满足我的1920x1080的要求。

但是,如果我这样做,则我的图片会变形。

photoFileImage = photoFileImage.subImage(0, 0, 1920, 1080, false);
OutputStream fos = fss.openOutputStream(m_photoFile );
imageIO.save(photoFileImage, fos, ImageIO.FORMAT_JPEG, 1);

我希望我的图片能够被缩放,并且多余的部分被裁剪掉。比如说,如果我的图片宽度为1920x1100,在高度上多出来的20个像素,我希望可以将它们裁剪掉,如果可能的话,10个在顶部,10个在底部。

我不确定该怎么做...

请帮忙,谢谢!


此外,对于-----Image photoFileImage= Image.createImage(m_photoFile); -----,photoFileImage.getHeight()和photoFileImage.getWidth()都返回0。 - Chuck
设备是什么,它创建的图像有多大?由于某些设备可以捕获无法加载的大型图像,因此Android有点棘手。我们有很多内置的解决方法来处理这些奇怪的问题,但最近的更新可能会导致一些问题。我建议不要使用subImage或类似的缩放调用,因为它们会将整个图像加载到RAM中,可能非常昂贵。尝试始终使用ImageIO来处理从相机捕获的任何内容。https://www.codenameone.com/javadoc/com/codename1/ui/util/ImageIO.html - Shai Almog
谢谢Shai,我采纳了Diamond的建议关于scaledLargerRatio...这对我很有帮助...无论如何,我都必须在屏幕上显示图像。 - Chuck
1个回答

2

试试这个:

String m_photoFile = Capture.capturePhoto();
Image image = Image.createImage(m_photoFile);
if (image.getWidth() > image.getHeight()) {
    image = image.scaledLargerRatio(1920, 1080);
    photoFileImage = image.subImage((int) (image.getWidth() - 1080) / 2, 0, image.getHeight(), image.getHeight(), true);
} else {
    image = image.scaledLargerRatio(1080, 1920);
    photoFileImage = image.subImage(0, (int) (image.getHeight() - 1080) / 2, image.getWidth(), image.getWidth(), true);
}

这个在模拟器上可以运行,但在安卓手机上 image.getWidth 和 image.getHeight 都返回 0。:( - Chuck
public Image scaledLargerRatio(int width, int height) -- 按比例缩放图像以保持较大尺寸的图像 || 很好,这很有用。 - Chuck
看起来我无法为答案投票...尽管我使用了scaledLargerRatio而没有进行w>h比较,但对我来说它是有效的。非常感谢。 - Chuck
答案旁边应该有一个“禁用”复选框,您可以单击它来接受它。 - Shai Almog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接