2

我有以下问题。我从一个位图转换例程开始,它完美地适用于我可以进行的任何类型的转换。

  Bitmap transform(Bitmap src) {
    // ... any kind of transformation , for example GAMMA
    double gama = 0.8;
    int[] tR = new int[256];
    int[] gG = new int[256];
    int[] tB = new int[256];
    for(int i = 0; i < 256; ++i) {
      tR[i] = (int)Math.min(255, (int)((255.0 * Math.pow(i / 255.0, 1.0 / gama)) + 0.5));
      tG[i] = (int)Math.min(255, (int)((255.0 * Math.pow(i / 255.0, 1.0 / gama)) + 0.5));
      tB[i] = (int)Math.min(255, (int)((255.0 * Math.pow(i / 255.0, 1.0 / gama)) + 0.5));
    }
    // apply transformation to the old bitmap -> bmOut  
    int wid = src.getWidth(), hei = src.getHeight();
    Bitmap bmOut = Bitmap.createBitmap(wid, hei, src.getConfig());
    int A, R, G, B;
    for(int x = 0; x < wid; x++) {
      for(int y = 0; y < hei; y++) {
        int pixel = src.getPixel(x, y);
        A = Color.alpha(pixel);
        R = tR[Color.red(pixel)];
        G = tG[Color.green(pixel)];
        B = tB[Color.blue(pixel)];
        bmOut.setPixel(x, y, Color.argb(A, R, G, B));
      }
    }
    return bmOut;
  }

但它非常缓慢 - 由 getPixel() / setPixel() 兄弟姐妹引起。没问题,我说,我将只使用内存缓冲区(就像在旧的 StretchBlt() 时代一样)。所以,我做了一个重大的重写,创建了以下软件工程的瑰宝:)

  Bitmap transform(Bitmap src) {
    // ... transformation array are built here

    // apply transformation  
    int wid = src.getWidth(), hei = src.getHeight();
    Bitmap bmOut = Bitmap.createBitmap(wid, hei, src.getConfig());

    int[] pixs = new int[wid*hei];                  // changed
    src.getPixels(pixs, 0, wid, 0, 0, wid, hei);    // changed

    int A, R, G, B;
    for(int x = 0; x < wid; x++) {
      for(int y = 0; y < hei; y++) {
        int off = ( x * y ) + y;                    // changed
        int pixel = pixs[off];                      // changed
        A = Color.alpha(pixel);
        R = tR[Color.red(pixel)];
        G = tG[Color.green(pixel)];
        B = tB[Color.blue(pixel)];
        pixs[off] = Color.argb(A, R, G, B);         // changed      
      }
    }
    bmOut.setPixels(pixs, 0, wid, 0, 0, wid, hei);  // changed
    return bmOut;
  }

运行速度很快,如果没有转换,甚至可以得到正确的结果。但如果我尝试按摩像素(应用转换),它就会崩溃。所以我比较了来自 getPixel() 的 ARGB 像素与来自 getPixels(...) 的像素值数组,它们是不同的(嗯,前两个是相同的,这让我有大约数不清的像素值不是)。

array     getPixel
a r g b   a r g b
------------------
ff65340b  ff65340b
ff64330a  ff64330a
ff66320b  ff63320a
ff65310a  ff613008
ff66300c  ff62300d
ff67310d  ff62300d
ff68300d  ff622d0d
ff69310e  ff5f2a0a
....

有人知道我这次做错了什么吗?我还不愿意放弃 mem-array 解决方案的速度。谢谢,肖恩

4

1 回答 1

1

它应该是

int off = ( y * wid ) + x;

顺便说一句,我认为这两个循环是不必要的,你可以简单地做:

for (int off = pixs.length - 1; off >= 0; off--) 
于 2013-03-16T06:00:54.847 回答