You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:05:40