将相机拍摄的照片上传到有限大小的服务器
Upload a picture taken by the camera to a server with limited size
标题听起来可能有点像 "noob question",但我很清楚如何为 Android 编程,我只是想弄清楚实现我想要的东西的最佳方法是什么。
我的用例是:用户拍摄照片并将其发送到我们的服务器,该服务器有 file-size 限制(这可能意味着我们必须直接在设备上调整照片的大小)。
看起来很简单,对吧? 我的问题如下:
1) 更好地使用可能会崩溃的 intents,因为某些相机应用程序是用 ass 编码的,或者使用 cawc 相机库构建基本视图 "take photo and confirm"? (我做了两个,我更喜欢意图,但我想对此发表意见)。
2) 你如何处理文件大小限制?我的意思是使用 File.length()
很容易获得照片的大小(即使返回的值不完全正确)但是如果你超过限制,你怎么能说 会有多大调整大小的图片?(你需要转换位图来调整它的大小,然后 OOMException
有很多问题,你无法计算磁盘上位图的最终大小,你需要压缩和写入磁盘后分析新创建的文件)。
感谢帮助:D
我之前也做过同样的事情
1.I 使用 intent 调用其他相机应用程序,并在 onActivityResult 内部,
我取回 URI 并根据需要进行处理。
我们确实调整了图片的大小,但我也保留了原始比例,并根据exif数据旋转了它。
希望这个调整大小的代码块可以给你一些提示。
public static Bitmap DecodeImage(String path, int resolution) {
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, opts);
opts.inSampleSize = computeSampleSize(opts, -1, resolution);
opts.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(path, opts);
}
public static int computeSampleSize(BitmapFactory.Options options,
int minSideLength, int maxNumOfPixels) {
int initialSize = computeInitialSampleSize(options, minSideLength,
maxNumOfPixels);
int roundedSize;
if (initialSize <= 8) {
roundedSize = 1;
while (roundedSize < initialSize) {
roundedSize <<= 1;
}
} else {
roundedSize = (initialSize + 7) / 8 * 8;
}
return roundedSize;
}
private static int computeInitialSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) {
double w = options.outWidth;
double h = options.outHeight;
int lowerBound = (maxNumOfPixels == -1) ? 1 :
(int) Math.ceil(Math.sqrt(w * h / maxNumOfPixels));
int upperBound = (minSideLength == -1) ? 128 :
(int) Math.min(Math.floor(w / minSideLength),
Math.floor(h / minSideLength));
if (upperBound < lowerBound) {
// return the larger one when there is no overlapping zone.
return lowerBound;
}
if ((maxNumOfPixels == -1) &&
(minSideLength == -1)) {
return 1;
} else if (minSideLength == -1) {
return lowerBound;
} else {
return upperBound;
}
}
解决方案并不花哨,但我在项目中就是这样做的,发布后目前我们没有遇到任何问题。
关于这个主题有很多问题,希望您搜索过。
Q) 更好地使用可能会崩溃的意图,因为某些相机应用程序是用屁股编码的,或者使用 cawc 相机库构建基本视图 "take photo and confirm"? (我做了两个,我更喜欢意图,但我想对此发表意见)。
A) 意图是最好的,因为它们是内置的,一些设备制造商意图裁剪和调整图像大小,我面临类似的问题,即同一制造商没有这些但在旧设备上。 stable/relible 第三方应用程序足以满足基本操作。
Q) 你如何处理文件大小限制?我的意思是使用 File.length() 很容易获得照片的大小(即使返回的值不完全正确)但是如果你超过限制,你怎么能说调整后的图片有多大? (你需要转换位图来调整它的大小,然后 OOMException 会出现很多问题,你无法计算磁盘上位图的最终大小,你需要将它压缩并写入磁盘,然后分析新创建的文件) .
A)
- 您如何处理文件大小限制?
尺寸限制取决于相机,如果您有 10MP 相机,那么最终尺寸将大于 5MP(希望您能得到零件)。
- 你需要在位图中转换以调整它的大小,然后 OOMException 会出现很多问题,你无法计算磁盘上位图的最终大小你可以计算图像在保持 Android 最佳实践不变的情况下,对其进行大小调整、采样、裁剪或调整大小,完成位图操作后立即回收位图。我有一个有 100 多张图片的应用程序,其中大部分被发送到服务器,有时它抛出 OOM,然后我相应地处理它。
您可以通过 link Loading Large Bitmap
他们对位图缩放的解释非常好。
如果您对此 link.
没有任何理解,请告诉我
谢谢
标题听起来可能有点像 "noob question",但我很清楚如何为 Android 编程,我只是想弄清楚实现我想要的东西的最佳方法是什么。
我的用例是:用户拍摄照片并将其发送到我们的服务器,该服务器有 file-size 限制(这可能意味着我们必须直接在设备上调整照片的大小)。
看起来很简单,对吧? 我的问题如下:
1) 更好地使用可能会崩溃的 intents,因为某些相机应用程序是用 ass 编码的,或者使用 cawc 相机库构建基本视图 "take photo and confirm"? (我做了两个,我更喜欢意图,但我想对此发表意见)。
2) 你如何处理文件大小限制?我的意思是使用 File.length()
很容易获得照片的大小(即使返回的值不完全正确)但是如果你超过限制,你怎么能说 会有多大调整大小的图片?(你需要转换位图来调整它的大小,然后 OOMException
有很多问题,你无法计算磁盘上位图的最终大小,你需要压缩和写入磁盘后分析新创建的文件)。
感谢帮助:D
我之前也做过同样的事情
1.I 使用 intent 调用其他相机应用程序,并在 onActivityResult 内部, 我取回 URI 并根据需要进行处理。
我们确实调整了图片的大小,但我也保留了原始比例,并根据exif数据旋转了它。 希望这个调整大小的代码块可以给你一些提示。
public static Bitmap DecodeImage(String path, int resolution) { BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inJustDecodeBounds = true; BitmapFactory.decodeFile(path, opts); opts.inSampleSize = computeSampleSize(opts, -1, resolution); opts.inJustDecodeBounds = false; return BitmapFactory.decodeFile(path, opts); } public static int computeSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) { int initialSize = computeInitialSampleSize(options, minSideLength, maxNumOfPixels); int roundedSize; if (initialSize <= 8) { roundedSize = 1; while (roundedSize < initialSize) { roundedSize <<= 1; } } else { roundedSize = (initialSize + 7) / 8 * 8; } return roundedSize; } private static int computeInitialSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) { double w = options.outWidth; double h = options.outHeight; int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math.sqrt(w * h / maxNumOfPixels)); int upperBound = (minSideLength == -1) ? 128 : (int) Math.min(Math.floor(w / minSideLength), Math.floor(h / minSideLength)); if (upperBound < lowerBound) { // return the larger one when there is no overlapping zone. return lowerBound; } if ((maxNumOfPixels == -1) && (minSideLength == -1)) { return 1; } else if (minSideLength == -1) { return lowerBound; } else { return upperBound; } }
解决方案并不花哨,但我在项目中就是这样做的,发布后目前我们没有遇到任何问题。
关于这个主题有很多问题,希望您搜索过。
Q) 更好地使用可能会崩溃的意图,因为某些相机应用程序是用屁股编码的,或者使用 cawc 相机库构建基本视图 "take photo and confirm"? (我做了两个,我更喜欢意图,但我想对此发表意见)。
A) 意图是最好的,因为它们是内置的,一些设备制造商意图裁剪和调整图像大小,我面临类似的问题,即同一制造商没有这些但在旧设备上。 stable/relible 第三方应用程序足以满足基本操作。
Q) 你如何处理文件大小限制?我的意思是使用 File.length() 很容易获得照片的大小(即使返回的值不完全正确)但是如果你超过限制,你怎么能说调整后的图片有多大? (你需要转换位图来调整它的大小,然后 OOMException 会出现很多问题,你无法计算磁盘上位图的最终大小,你需要将它压缩并写入磁盘,然后分析新创建的文件) .
A)
- 您如何处理文件大小限制? 尺寸限制取决于相机,如果您有 10MP 相机,那么最终尺寸将大于 5MP(希望您能得到零件)。
- 你需要在位图中转换以调整它的大小,然后 OOMException 会出现很多问题,你无法计算磁盘上位图的最终大小你可以计算图像在保持 Android 最佳实践不变的情况下,对其进行大小调整、采样、裁剪或调整大小,完成位图操作后立即回收位图。我有一个有 100 多张图片的应用程序,其中大部分被发送到服务器,有时它抛出 OOM,然后我相应地处理它。
您可以通过 link Loading Large Bitmap
他们对位图缩放的解释非常好。 如果您对此 link.
没有任何理解,请告诉我谢谢