zhangzxpan 2023-03-02 23:34 采纳率: 76.5%
浏览 51
已结题

Android Bitmap保存到本地没有作用,怎么处理?

读取了一个图片,又新建了一个bitmap,然后使用bmp.setPixel(x, y, Color.argb(a, r, g, b))将新建的bitmap色彩填满,然后想要用新建图片保存覆盖原图片。


Bitmap bmp = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);

使用如下方法保存,运行没问题,但是打开图片发现,新图片并没有覆盖原图片。读写权限没问题

FileOutputStream fos = new FileOutputStream(pic_url);
 bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.flush();
 fos.close();

又尝试使用如下字节流的方法保存,保存后直接图片无法读取了

 byte pixels[] = new byte[bmp.getWidth() * bmp.getHeight() * 4];
                bmp.copyPixelsToBuffer(ByteBuffer.wrap(pixels));
                File bmpfile = new File(pic_url);
                if (bmpfile.exists()) {
                    bmpfile.delete();
                    bmpfile.createNewFile();
                }
                FileOutputStream fos = new FileOutputStream(bmpfile);
                fos.write(pixels);
                fos.close();

重新读取图片时出现如下报错:

2023-03-02 23:17:27.181 12019-12019/com.example.myapplication E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.myapplication, PID: 12019
    java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference

请问如何才能有效保存覆盖原图片?

  • 写回答

7条回答 默认 最新

  • qq_34380926 2023-03-03 03:26
    关注

    确保 pic_url 指向的是原始图片的路径,即确保使用了正确的路径。

    确保在保存前调用了 bmp.setPixel(x, y, Color.argb(a, r, g, b)),以填充 bmp。

    如果你的原始图片是 JPEG 格式,那么在保存时应该使用 Bitmap.CompressFormat.JPEG 格式。如果原始图片是 PNG 格式,则应该使用 Bitmap.CompressFormat.PNG 格式。

    确保保存时不要忘记调用 flush() 和 close() 方法。

    如果使用了字节流保存方法,可以尝试使用 bmp.copyPixelsToBuffer(ByteBuffer.wrap(pixels)) 将 bmp 的像素数据写入到 pixels 数组中。

    最后,你可以尝试在保存完成后检查是否保存成功,并手动将新图片复制到原始图片的路径,以确保覆盖原图片。

    以下是一个Java示例代码,可能会有所帮助:

    
    // 读取原图片
    Bitmap bitmap = BitmapFactory.decodeFile(pic_url);
    // 创建一个新的bitmap,并填充颜色
    Bitmap bmp = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
    for (int y = 0; y < bitmap.getHeight(); y++) {
        for (int x = 0; x < bitmap.getWidth(); x++) {
            bmp.setPixel(x, y, Color.argb(a, r, g, b));
        }
    }
    // 保存新图片并覆盖原图片
    FileOutputStream fos = new FileOutputStream(pic_url);
    bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);
    fos.flush();
    fos.close();
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

问题事件

  • 系统已结题 3月11日
  • 已采纳回答 3月3日
  • 创建了问题 3月2日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效