Android在保存到SD卡之前拍照并调整大小
Posted
技术标签:
【中文标题】Android在保存到SD卡之前拍照并调整大小【英文标题】:Android take photo and resize it before saving on sd card 【发布时间】:2013-04-10 05:18:57 【问题描述】:我希望我的代码在保存之前调整图像大小,但我在 Google 上找不到任何相关信息。 你能帮帮我吗?
这是代码(来自 android 文档):
private void galleryAddPic()
Intent mediaScanIntent = new Intent("android.intent.action.MEDIA_SCANNER_SCAN_FILE");
File f = new File(mCurrentPhotoPath);
picturePathForUpload = mCurrentPhotoPath;
Uri contentUri = Uri.fromFile(f);
mediaScanIntent.setData(contentUri);
this.sendBroadcast(mediaScanIntent);
之后,我必须将其上传到服务器。
非常感谢。
【问题讨论】:
嗨弗洛里安你看过这个页面吗:***.com/questions/12780375/… Bonne journée! :) 【参考方案1】:您可以按照以下代码保存位图图像
Bitmap photo = (Bitmap) "your Bitmap image";
photo = Bitmap.createScaledBitmap(photo, 100, 100, false);
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
photo.compress(Bitmap.CompressFormat.JPEG, 40, bytes);
File f = new File(Environment.getExternalStorageDirectory()
+ File.separator + "Imagename.jpg");
f.createNewFile();
FileOutputStream fo = new FileOutputStream(f);
fo.write(bytes.toByteArray());
fo.close();
【讨论】:
这将产生一个缩略图而不是全尺寸的。 这也会影响图像的清晰度 鉴于以上cmets,请看我的回答:***.com/a/36210688/4038790我认为它更好地解决了你的问题。【参考方案2】:在阅读了其他答案并没有找到我想要的东西之后,这是我获取适当缩放位图的方法。这是对 Prabu 答案的改编。
它确保您的图片以不变形照片尺寸的方式缩放:
public saveScaledPhotoToFile()
//Convert your photo to a bitmap
Bitmap photoBm = (Bitmap) "your Bitmap image";
//get its orginal dimensions
int bmOriginalWidth = photoBm.getWidth();
int bmOriginalHeight = photoBm.getHeight();
double originalWidthToHeightRatio = 1.0 * bmOriginalWidth / bmOriginalHeight;
double originalHeightToWidthRatio = 1.0 * bmOriginalHeight / bmOriginalWidth;
//choose a maximum height
int maxHeight = 1024;
//choose a max width
int maxWidth = 1024;
//call the method to get the scaled bitmap
photoBm = getScaledBitmap(photoBm, bmOriginalWidth, bmOriginalHeight,
originalWidthToHeightRatio, originalHeightToWidthRatio,
maxHeight, maxWidth);
/**********THE REST OF THIS IS FROM Prabu's answer*******/
//create a byte array output stream to hold the photo's bytes
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
//compress the photo's bytes into the byte array output stream
photoBm.compress(Bitmap.CompressFormat.JPEG, 40, bytes);
//construct a File object to save the scaled file to
File f = new File(Environment.getExternalStorageDirectory()
+ File.separator + "Imagename.jpg");
//create the file
f.createNewFile();
//create an FileOutputStream on the created file
FileOutputStream fo = new FileOutputStream(f);
//write the photo's bytes to the file
fo.write(bytes.toByteArray());
//finish by closing the FileOutputStream
fo.close();
private static Bitmap getScaledBitmap(Bitmap bm, int bmOriginalWidth, int bmOriginalHeight, double originalWidthToHeightRatio, double originalHeightToWidthRatio, int maxHeight, int maxWidth)
if(bmOriginalWidth > maxWidth || bmOriginalHeight > maxHeight)
Log.v(TAG, format("RESIZING bitmap FROM %sx%s ", bmOriginalWidth, bmOriginalHeight));
if(bmOriginalWidth > bmOriginalHeight)
bm = scaleDeminsFromWidth(bm, maxWidth, bmOriginalHeight, originalHeightToWidthRatio);
else
bm = scaleDeminsFromHeight(bm, maxHeight, bmOriginalHeight, originalWidthToHeightRatio);
Log.v(TAG, format("RESIZED bitmap TO %sx%s ", bm.getWidth(), bm.getHeight()));
return bm;
private static Bitmap scaleDeminsFromHeight(Bitmap bm, int maxHeight, int bmOriginalHeight, double originalWidthToHeightRatio)
int newHeight = (int) Math.min(maxHeight, bmOriginalHeight * .55);
int newWidth = (int) (newHeight * originalWidthToHeightRatio);
bm = Bitmap.createScaledBitmap(bm, newWidth, newHeight, true);
return bm;
private static Bitmap scaleDeminsFromWidth(Bitmap bm, int maxWidth, int bmOriginalWidth, double originalHeightToWidthRatio)
//scale the width
int newWidth = (int) Math.min(maxWidth, bmOriginalWidth * .75);
int newHeight = (int) (newWidth * originalHeightToWidthRatio);
bm = Bitmap.createScaledBitmap(bm, newWidth, newHeight, true);
return bm;
这是我的 GitHub Gist 的相应链接:https://gist.github.com/Lwdthe1/2d1cd0a12f30c18db698
【讨论】:
如果照片是方形的(宽度 == 高度),您的方法 getScaledBitmap(...) 将避免缩放。您需要删除此行: START OF LINE: else if (bmOriginalHeight > bmOriginalWidth) END OF LINE 并使用 else 你不应该使用 Math.min 吗? 它允许我将 >= 1.5MB 的位图压缩到 @FernandoTan 很高兴听到!如果对您有帮助,请投票。【参考方案3】:首先将您的图像转换为位图,然后使用此代码:
Bitmap yourBitmap;
Bitmap resized = Bitmap.createScaledBitmap(yourBitmap, newWidth, newHeight, true);
【讨论】:
谢谢@John!但是...我怎样才能保存它? 查看这个链接,和你想要的很相似:***.com/questions/7687723/…【参考方案4】:See this 会很有帮助。一般来说,如果您使用意图通过相机拍摄图像,您将获得图像的uri
,因为您将其读取为按比例缩小的图像并将其存储在同一位置
【讨论】:
【参考方案5】:如果你想截取一张全尺寸的图片,那么你别无选择,只能将它保存到 sd 购物车,然后更改图片的大小。
如果缩略图足够,则无需将其保存到 SD 卡,您可以从返回的意图的附加内容中提取它。
您可以查看我为使用内置相机Activity
拍摄图像的两种方法编写的本指南:
Guide: Android: Use Camera Activity for Thumbnail and Full Size Image
【讨论】:
【参考方案6】:BitmapFactory.Options optionsSignature = new BitmapFactory.Options();
final Bitmap bitmapSignature = BitmapFactory.decodeFile(
fileUriSignature.getPath(), optionsSignature);
Bitmap resizedSignature = Bitmap.createScaledBitmap(
bitmapSignature, 256, 128, true);
signature.setImageBitmap(resizedSignature);
【讨论】:
以上是关于Android在保存到SD卡之前拍照并调整大小的主要内容,如果未能解决你的问题,请参考以下文章
我做了一个启动相机的PhoneGap应用程序,拍照并保存到SD卡。如何让该图片以 HTML 格式显示?