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 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装
  • ¥40 复杂的限制性的商函数处理