使用Picasso无法调整图片大小,上传服务器后未生效求技术协助
解决Picasso调整图片大小后未生效的问题
嘿,我明白你的困扰了!你说用Picasso调整图片尺寸后上传到服务器,但实际传的还是原图对吧?这大概率是因为你没有把Picasso处理后的图片保存为新文件,而是直接上传了原始的mCurrentPhotoPath对应的文件——毕竟Picasso默认只是在内存中处理Bitmap,不会自动修改你原有的图片文件哦。
下面给你具体的解决方案,分步骤来:
1. 核心思路
先用Picasso加载原始图片、调整尺寸,然后将处理后的Bitmap写入一个新的文件,最后上传这个新文件,而不是原始的mCurrentPhotoPath文件。
2. 具体代码实现
第一步:写一个调整并保存图片的方法
这个方法会用Picasso异步处理图片,然后把处理后的Bitmap保存到内部目录的新文件中:
private void resizeAndSaveImage(String originalFilePath, String outputFilePath, int targetWidth, int targetHeight) { Picasso.get() .load(new File(originalFilePath)) .resize(targetWidth, targetHeight) // 设置目标尺寸,比如800x800 .onlyScaleDown() // 可选:只在原图比目标尺寸大的时候缩放,避免放大导致模糊 .centerCrop() // 可选:根据需求换成centerInside(保持完整)或其他裁剪方式 .into(new Target() { @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { try { // 写入处理后的图片到新文件 File outputFile = new File(outputFilePath); FileOutputStream fos = new FileOutputStream(outputFile); // 压缩Bitmap为JPEG,第二个参数是质量(0-100,越高越清晰但文件越大) bitmap.compress(Bitmap.CompressFormat.JPEG, 80, fos); fos.flush(); fos.close(); // 这里调用你的上传方法,传入新文件的路径 uploadImageToServer(outputFilePath); } catch (IOException e) { e.printStackTrace(); } } @Override public void onBitmapFailed(Exception e, Drawable errorDrawable) { // 处理图片加载失败的情况 Log.e("PicassoError", "Failed to resize image", e); } @Override public void onPrepareLoad(Drawable placeHolderDrawable) { // 可选:加载前的准备,比如显示加载动画 } }); }
第二步:调用方法生成新文件并上传
在你需要调整图片的地方,生成一个新的输出路径,然后调用上面的方法:
try { // 原始图片路径就是你的mCurrentPhotoPath File originalFile = new File(mCurrentPhotoPath); // 生成新的文件名,避免覆盖原有文件 String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); String resizedFileName = "RESIZED_JPEG_" + timeStamp + ".jpg"; // 保存到内部目录,不需要额外权限 File resizedFile = new File(getFilesDir(), resizedFileName); // 调用调整方法,目标尺寸设为你需要的大小,比如800x800 resizeAndSaveImage(mCurrentPhotoPath, resizedFile.getAbsolutePath(), 800, 800); } catch (Exception e) { e.printStackTrace(); }
3. 常见错误点提醒
- 不要直接上传
mCurrentPhotoPath的原始文件,一定要上传处理后的新文件 - 如果用
Picasso.get().load(...).get()同步获取Bitmap,绝对不能在主线程调用,否则会导致ANR(应用无响应),所以推荐用异步的Target方式 - 内部目录的文件不需要申请存储权限,如果你要保存到外部存储,记得动态申请
WRITE_EXTERNAL_STORAGE权限
这样处理后,上传到服务器的就是调整过大小的图片啦!
内容的提问来源于stack exchange,提问作者sandy
相关产品推荐
相关产品推荐

