3 回答
TA贡献1895条经验 获得超3个赞
private static final int MAX_FEAT_IMAGE_WIDTH = 600;
private static final int MAX_FEAT_IMAGE_WIDTH = 600;
double featImageWidth = originalImage.getWidth();
double featImageHeight = originalImage.getHeight();
// Sanity check on the input (division by zero, infinity):
if (featImageWidth <= 1 || featImageHeight <= 1) {
throw new IllegalArgumentException("..." + featureImage);
}
// The scaling factors to reach to maxima on width and height:
double xScale = MAX_FEAT_IMAGE_WIDTH / featImageWidth;
double yScale = MAX_FEAT_IMAGE_HEIGHT / featImageHeight;
// Proportional (scale width and height by the same factor):
double scale = Math.min(xScale, yScale);
// (Possibly) Do not enlarge:
scale = Math.min(1.0, scale);
int finalWidth = Math.min((int) Math.round(scale * featImageWidth), MAX_FEAT_IMAGE_WIDTH);
int finalHeight = Math.min((int) Math.round(scale * featImageHeigth), MAX_FEAT_IMAGE_HEIGHT);
如您所见,我扭转了两件事,以保持比例缩放。在心理上使用比率 ( /) 而不是比例因子 ( *) 似乎更难。
分别确定宽度和高度的缩放比例让我们选择最小缩放比例。
一个人也可以决定不放大小图片。
TA贡献1842条经验 获得超21个赞
您只考虑方向(ratio< 1 表示垂直,否则为水平或正方形)。这还不够;您必须考虑目标宽度/高度:
int sw = originalImage.getWidth();
int sh = originalImage.getHeight();
int swdh = sw * maxFeatImageHeight;
int shdw = sh * maxFeatImageWidth;
if (swdh < shdw) {
finalWidth = swdh / sh;
finalHeight = maxFeatImageHeight;
} else {
finalWidth = maxFeatImageWidth;
finalHeight = shdw / sw;
}
更新:
好的,让我们从天平开始:
double xScale = maxFeatImageWidth/featImageWidth;
double yScale = maxFeatImageHeight/featImageHeight;
你可以写:
在 yScale < xScale 的情况下,我们需要使用 yScale:
finalWidth = featImageWidth*yScale = featImageWidth*maxFeatImageHeight/featImageHeight;
finalHeight = maxFeatImageHeight;
否则,我们可以使用 xScale:
finalWidth = maxFeatImageWidth;
finalHeight = featImageHeight*xScale = featImageHeight*maxFeatImageWidth/featImageWidth;
由于所有宽度和高度都 > 0,因此 yScale < xScale 的结果与:
featImageWidth*featImageHeight*yScale < featImageWidth*featImageHeight*xScale
所以
featImageWidth*featImageHeight*maxFeatImageHeight/featImageHeight < featImageWidth*featImageHeight*maxFeatImageWidth/featImageWidth
和
maxFeatImageHeight*featImageWidth < maxFeatImageHeight*featImageWidth
我将这两个值保存为 swdh 和 shdw,因为它们可以在以后重复使用。
int它避免了从到double和从double到的转换int。
TA贡献1780条经验 获得超1个赞
很可能你应该知道要调整大小的图像的大小,然后基于该值 if 和 else 语句应该起作用,然后调用调整大小函数你将能够调整它的大小。我希望这有帮助。并且当您调整大小时,请确保您也能够按照用户定义的方式减少像素。
添加回答
举报