为什么我的 scaleImage 方法会得到奇怪的结果?
Why am I getting a weird results from my scaleImage method?
我正在尝试根据 width/height 缩放图像。这是我的方法:
private byte[] scaleImage(Bitmap image) {
byte[] image = new byte[]{};
int width= image.getWidth();
int height = image.getHeight();
int wh = width / height ;
int hw = height / width ;
int newHeight, newWidth;
if (width> 250 || height> 250) {
if (width> height) { //landscape-mode
newHeight= 250;
newWidth = Math.round((int)(long)(250 * wh));
Bitmap sizeChanged = Bitmap.createScaledBitmap(image, newWidth, newHeight, true);
int bytes = størrelseEndret.getByteCount();
ByteBuffer bb = ByteBuffer.allocate(bytes);
sizeChanged.copyPixelsFromBuffer(bb);
image = bb.array();
} else { //portrait-mode
newWidth = 250;
newHeight = Math.round((int)(long)(250 * hw));
...same
}
}
return image;
}
之后,我编写了一些代码将图像从 Bitmap
转换为 byte[] array
,但是在 Debug
之后,我发现我得到了非常奇怪的值。例如:
width = 640
、height = 480
,但 wh = 1
、hw = 0
、newHeight = 200
和 newWidth = 200?
!我根本不明白为什么?我究竟做错了什么?非常感谢任何帮助或提示。谢谢,卡尔
你 运行 遇到了整数运算问题,基本上 - 你正在执行除法以获得比例因子,但作为一个整数 - 所以对于像 640x480 这样的东西,比例因子将是1和0,因为640/480是1,480/640是0.
您可以将其更改为 (x1*y2)/y1
,而不是将其处理为 (x1/y1)*y2
,以便在 之后执行除法 。只要您不溢出乘法中的整数限制(此处不太可能),就应该没问题。所以我将您的代码重写为:
private byte[] scaleImage(Bitmap image) {
byte[] image = new byte[]{};
int width = image.getWidth();
int height = image.getHeight();
int newHeight, newWidth;
if (width > 250 || height > 250) {
if (width > height) { //landscape-mode
newHeight = 250;
newWidth = (newHeight * width) / height;
} else {
newWidth = 250;
newHeight = (newWidth * height) / width;
}
} else {
// Whatever you want to do here
}
// Now use newWidth and newHeight
}
(如果可能,我肯定会将 "calculating newWidth
and newHeight
" 与 "performing the scaling" 分开,以避免重复代码。)
我正在尝试根据 width/height 缩放图像。这是我的方法:
private byte[] scaleImage(Bitmap image) {
byte[] image = new byte[]{};
int width= image.getWidth();
int height = image.getHeight();
int wh = width / height ;
int hw = height / width ;
int newHeight, newWidth;
if (width> 250 || height> 250) {
if (width> height) { //landscape-mode
newHeight= 250;
newWidth = Math.round((int)(long)(250 * wh));
Bitmap sizeChanged = Bitmap.createScaledBitmap(image, newWidth, newHeight, true);
int bytes = størrelseEndret.getByteCount();
ByteBuffer bb = ByteBuffer.allocate(bytes);
sizeChanged.copyPixelsFromBuffer(bb);
image = bb.array();
} else { //portrait-mode
newWidth = 250;
newHeight = Math.round((int)(long)(250 * hw));
...same
}
}
return image;
}
之后,我编写了一些代码将图像从 Bitmap
转换为 byte[] array
,但是在 Debug
之后,我发现我得到了非常奇怪的值。例如:
width = 640
、height = 480
,但 wh = 1
、hw = 0
、newHeight = 200
和 newWidth = 200?
!我根本不明白为什么?我究竟做错了什么?非常感谢任何帮助或提示。谢谢,卡尔
你 运行 遇到了整数运算问题,基本上 - 你正在执行除法以获得比例因子,但作为一个整数 - 所以对于像 640x480 这样的东西,比例因子将是1和0,因为640/480是1,480/640是0.
您可以将其更改为 (x1*y2)/y1
,而不是将其处理为 (x1/y1)*y2
,以便在 之后执行除法 。只要您不溢出乘法中的整数限制(此处不太可能),就应该没问题。所以我将您的代码重写为:
private byte[] scaleImage(Bitmap image) {
byte[] image = new byte[]{};
int width = image.getWidth();
int height = image.getHeight();
int newHeight, newWidth;
if (width > 250 || height > 250) {
if (width > height) { //landscape-mode
newHeight = 250;
newWidth = (newHeight * width) / height;
} else {
newWidth = 250;
newHeight = (newWidth * height) / width;
}
} else {
// Whatever you want to do here
}
// Now use newWidth and newHeight
}
(如果可能,我肯定会将 "calculating newWidth
and newHeight
" 与 "performing the scaling" 分开,以避免重复代码。)