【问题标题】:storing bitmap in integer array将位图存储在整数数组中
【发布时间】:2011-09-19 22:24:46
【问题描述】:

什么是最好的方法来做到这一点。我有一个长度为高度*宽度的数组。我是否只是循环位图,根据循环索引将每个像素设置为数组?谢谢

[更新] 这是一个在位图上放置鱼眼失真的应用程序。我试图将像素数据存储在一个数组中,而不是调用 Bitmap.setPixel(),因为这会带来大量的 GC 开销

 for (int j=0;j<dst.getHeight();j++) {
        for (int i=0;i<dst.getWidth();i++) {
            origPixel= input.getPixel(i,j);
            getRadXStart = System.currentTimeMillis();
            float x = getRadialX((float)j,(float)i,centerX,centerY,k);
            float y = getRadialY((float)j,(float)i,centerX,centerY,k);
            sampleImage(input,x,y);

            color = ((s[1]&0x0ff)<<16)|((s[2]&0x0ff)<<8)|(s[3]&0x0ff);
        //  System.out.print(i+" "+j+" \\");

            //if( Math.sqrt( Math.pow(i - centerX, 2) + ( Math.pow(j - centerY, 2) ) ) <= 150 ){
            if (Math.pow(i - centerX, 2) + ( Math.pow(j - centerY, 2) ) <= 22500 ) {
                // dst.setPixel(i, j, color);
                arr[i]=color;
            } else {
                //dst.setPixel(i,j,origPixel);
                arr[i]=origPixel;
            }
        }
    }

Bitmap dst2 = Bitmap.createBitmap(arr,width,height,input.getConfig());
        return dst2;

【问题讨论】:

  • 示例代码向我们展示了什么?你在哪里设置像素?

标签: java android image-processing bitmap


【解决方案1】:

你试过getPixels(...) on Bitmap的方法吗?

【讨论】:

  • 嗨,我想你只是错过了我的更新。 Bitmap 中的 set/getPixel 会带来很大的 GC 开销。转换图像大约需要 50 秒。这是由于执行了 gc。我已经运行了 traceview,这是我需要避免的位图​​集/getPixel
  • 我不是在谈论 getPixel(...) 的方法,我是在谈论 getPixels(...)(注意 's'),它将所有像素颜色数据加载到整数 []。这不是你所追求的吗?你说的这个 GC 开销在哪里?
  • 抱歉错过了你的观点。是的,我会尝试这样做,因为只有位图类需要调用。谢谢
  • 实际上我不认为我可以使用它,因为我需要循环通过位图来应用效果。它是目标位图中像素的设置,它带有 setPixel() 的开销。如果我可以将像素数据写入数组而不是调用 tp bitmap setPixel 那么应用程序将加速。我只是将数组传递给位图静态 createBitmap()
【解决方案2】:

要填充它,您必须遍历位图来设置每个像素。也就是说,我不知道您是否会看到性能大幅提升。

【讨论】:

  • @haphazard 嗨,为什么是 3 个数组?每个像素的颜色不是存储为int值吗?
  • @haphazard 方法 samleImage 在扭曲图像方面发挥了作用,并且不会对位图设置器/获取器进行大量调用。我认为正是这些调用影响了 GC。除了显示位图时,该应用程序运行良好,我认为仅显示顶行像素,其余位图为黑色。我认为这是我将像素输入数组或其他东西或循环问题的方式
  • @turtleboy 只有在创建对象然后取消引用时才会调用 GC。假设 Bitmap 对象实际上存储为一堆 int,它实际上是在执行您想要对数组执行的操作。
  • @haphazard 嗨,我已经通过使用数组将它缩短到 15 秒,我认为 dst.setPixel 会依次调用或检查很多其他事情。我观看了一个谷歌视频,描述了位图如何存储在本机层以及所涉及的开销。我正在使用具有效果的叠加层,它需要 tweeking 现在让应用程序在 6 秒内处理位图,只是想我会更新并感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-12
  • 1970-01-01
  • 1970-01-01
  • 2017-10-02
  • 1970-01-01
  • 2013-09-01
  • 2019-06-12
相关资源
最近更新 更多