【问题标题】:Why does BitmapFactory.decodeByteArray return null?为什么 BitmapFactory.decodeByteArray 返回 null?
【发布时间】:2011-06-29 12:38:18
【问题描述】:

这是简单的代码,我没有得到结果来设置位图,而是得到了 null。谁能告诉我哪里出错了?

String test = "test";
byte[] byteA = test.getBytes();
Bitmap bmp = BitmapFactory.decodeByteArray(byteA, 0, byteA.length); //<- I get null here
ImageView image = (ImageView) findViewById(R.id.image);
image.setImageBitmap(bmp);

更新

好的,所以我不能像我想象的那样将文本转换为图像。这条路怎么样?这会创建一个位图吗?

  Paint paint = new Paint();
    paint.setStyle(Paint.Style.FILL);
    paint.setColor(Color.RED);
    paint.setTextSize(16);
    paint.setAntiAlias(true);
    paint.setTypeface(Typeface.MONOSPACE);

    Bitmap bm = Bitmap.createBitmap(16, 16, Bitmap.Config.ALPHA_8);
    float x = bm.getWidth();
    float y = bm.getHeight();
    Canvas c = new Canvas(bm);
    c.drawText("Test", x, y, paint);

【问题讨论】:

    标签: java android


    【解决方案1】:

    来自the documentation

    返回解码后的位图,如果图像无法解码,则返回 null。

    字符串“test”中涉及的字节不是有效的位图,是吗?

    如果您将文本“test”保存在名为foo.pngfoo.jpg 等的文件中并尝试在Windows 中打开它,您希望结果是什么?这将是一个错误:这些字节只是不是任何已知格式的有效图像。

    编辑:我对 Android 图形一无所知,但您的更新确实看起来是一种在位图上绘制文本更合理的方式。

    【讨论】:

    • 我知道。我读过它:)。我的意思是,为什么它不创建位图?代码哪里出错了?
    • 字符串“test”是十六进制的74657374。您正在尝试将其渲染为位图。它不是一个。
    • @askmoo:错误在于试图读取四个字节,就好像它们是图像一样。你认为这些字节是什么图像格式? PNG? JPEG?您希望图像是什么?请注意,您没有加载名为“test”的文件或类似的文件...您只是尝试从代表平台默认编码中的字符串“test”的字节创建图像.
    • @askmoo,你说你知道decodeByteArray 做了什么,但你的问题和随后的 cmets 建议不是这样。你问你做错了什么,你目前有 4 个(实际上相同)答案告诉你你做错了什么,所以我不得不问 - 你究竟期望发生什么?您显然使用了错误的方法来解决您遇到的问题。
    • 这个问题出现在我写这个问题的时候:)。现在我知道错在哪里了。
    【解决方案2】:

    在这种情况下,您需要先将字符串转换为 Base64。

    String strImage = geTImageAsHexString();
    byte[] x = Base64.decode(strImage, Base64.DEFAULT);  //convert from base64 to byte array
    Bitmap bmp = BitmapFactory.decodeByteArray(x,0,x.length);
    

    【讨论】:

      【解决方案3】:

      因为"test".getBytes() 中的字节不代表有效的位图

      您需要创建一个实际包含编码位图的字节数组,而不仅仅是一些与字符串表示相对应的“随机字节”。

      【讨论】:

      • 那么如何将String转为byte[] -> byte[]转为Image呢?我认为这是这样做的方法。
      • @askmoo:你希望图像包含什么? “测试”一词的图片?真的不清楚你要做什么......
      • @Skeet 你是对的。我已经编辑了代码,我将很快粘贴新代码。谢谢
      【解决方案4】:

      你得到null,因为你提供了无效的位图数据。

      参见BitmapFactory.decodeByteArray() 的文档。

      【讨论】:

        【解决方案5】:

        您正在尝试将字符串解析为位图。 BitmapFactory.decodeByteArray() 将失败,除非字节数组中有有效的位图。在这种情况下没有,所以它返回 null。

        【讨论】:

        • 那么如何将String转为byte[] -> byte[]转为Image呢?我认为这是这样做的方法。
        • 使用Bitmap bm = Bitmap.createBitmap(); 创建一个Bitmap,然后使用Canvas c = new Canvas( bm ); 创建一个画布,然后使用c.drawText() 在画布中创建一些文本。位图将包含您的文本。如果您对 Canvas 不熟悉,可能需要在 Google 上获取一些教程。
        • 您实际上没有与图像相关的字符串。您的意思是,根据您在 String 中的名称加载文件?
        • 您更新后的代码绘制文本,但它将超出位图的范围,因此您将看不到它。此外,当您调用setTextSixe( 16 ) 时,您不会将太多文本放入 16 x 16 位图中。我认为这已经远远超出了原始问题的范围,如果您需要任何进一步的帮助,我建议您提出一个新问题。
        【解决方案6】:

        压缩图像数据的字节数组 - 这是什么以及它与 byte[] data = new byte[sz] 有何不同?

        至今没有人给出明确的答案!人们一直在谈论的是有一个无效的位图。一个更具信息性的答案是如何在低级别创建一个有效的字节数组

        【讨论】:

          【解决方案7】:

          在我的情况下,BitmapFactory.decodeByteArray 返回 null 因为接收到的图像缓冲区不正确。尝试查看发送缓冲区和传入缓冲区,我相信您会看到两个数组的差异。大多数时候这就是原因。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-12-26
            相关资源
            最近更新 更多