【问题标题】:Enhancing ImageView brightness programmatically以编程方式增强 ImageView 亮度
【发布时间】:2014-12-17 21:13:37
【问题描述】:

我有一个 android 应用程序,我正在使用下面的代码增加图像的亮度。但这非常慢,所以有没有人知道在 android 中增强图像视图的图像亮度的快速方法。请记住,这是提高图像视图亮度而不是屏幕亮度

 public static Bitmap doBrightness(Bitmap src, int value) {
    //Log.e("Brightness", "Changing brightnhjh");

    int width = src.getWidth();
    int height = src.getHeight();
    Bitmap bmout = Bitmap.createBitmap(width, height, src.getConfig());
    int A, R, G, B;
    int pixel;
    for (int i = 0; i < width; i=i++) {
        for (int j = 0; j < height; j=j++) {
            pixel = src.getPixel(i, j);
            A = Color.alpha(pixel);
            R = Color.red(pixel);
            G = Color.green(pixel);
            B = Color.blue(pixel);
            R += value;
            if (R > 255) {
                R = 255;
            } else if (R < 0) {
                R = 0;
            }
            G += value;
            if (G > 255) {
                G = 255;
            } else if (G < 0) {
                G = 0;
            }
            B += value;
            if (B > 255) {
                B = 255;
            } else if (B < 0) {
                B = 0;
            }
            bmout.setPixel(i, j, Color.argb(A, R, G, B));
        }
    }
    return bmout;

}

这是图像视图

imageview.setImageBitmap(doBrightness(image, 40));

【问题讨论】:

    标签: android optimization android-imageview


    【解决方案1】:

    您可以使用以下代码来增强图像:

    public static Bitmap enhanceImage(Bitmap mBitmap, float contrast, float brightness) {
        ColorMatrix cm = new ColorMatrix(new float[]
            {
                contrast, 0, 0, 0, brightness,
                0, contrast, 0, 0, brightness,
                0, 0, contrast, 0, brightness,
                0, 0, 0, 1, 0
            });
        Bitmap mEnhancedBitmap = Bitmap.createBitmap(mBitmap.getWidth(), mBitmap.getHeight(), mBitmap
            .getConfig());
        Canvas canvas = new Canvas(mEnhancedBitmap);
        Paint paint = new Paint();
        paint.setColorFilter(new ColorMatrixColorFilter(cm));
        canvas.drawBitmap(mBitmap, 0, 0, paint);
        return mEnhancedBitmap;
    }
    

    注意:
    对比度:0 到 10 亮度:-255 到 255

    【讨论】:

      【解决方案2】:

      我已经解决了这个问题,我使图像更亮,然后在图像视图中显示它。我使用的代码如下:

      foto.setColorFilter(brightIt(100));//foto is my ImageView
      //and below is the brightIt func
      public static ColorMatrixColorFilter brightIt(int fb) {
      ColorMatrix cmB = new ColorMatrix();
      cmB.set(new float[] { 
          1, 0, 0, 0, fb,
          0, 1, 0, 0, fb,
          0, 0, 1, 0, fb,
          0, 0, 0, 1, 0   });
      
      ColorMatrix colorMatrix = new ColorMatrix();
      colorMatrix.set(cmB);
      //Canvas c = new Canvas(b2);
      //Paint paint = new Paint();
      ColorMatrixColorFilter f = new ColorMatrixColorFilter(colorMatrix);
      //paint.setColorFilter(f);   
      return f;
      }
      

      【讨论】:

      • 你为什么要创建一个颜色矩阵,设置它,然后创建另一个颜色矩阵,并使用你刚刚设置的矩阵进行设置?
      【解决方案3】:

      我不记得我是从哪里得到这个的,但我用这个(负值可以让颜色变暗,用正值可以让颜色变亮)

      drawable.setColorFilter(applyLightness(-30));
      
      
      public static PorterDuffColorFilter applyLightness(int progress)
      {
          if (progress > 0)
          {
              int value = (int) progress * 255 / 100;
              return new PorterDuffColorFilter(Color.argb(value, 255, 255, 255), Mode.SRC_OVER);
          }
          else
          {
              int value = (int) (progress * -1) * 255 / 100;
              return new PorterDuffColorFilter(Color.argb(value, 0, 0, 0), Mode.SRC_ATOP);
          }
      }
      

      编辑:找到我从哪里得到的:Adjusting Lightness using ColorMatrix

      【讨论】:

      • 它很亮,但不接触整体 RGB 比例,图像看起来不真实。
      【解决方案4】:

      上述答案对我不起作用,因为我有一个使用位图设置图像的图像视图。 所以这就是它的工作原理:

          private ColorMatrixColorFilter brightness(float value) {
              ColorMatrix cmB = new ColorMatrix();
              cmB.set(new float[]{
                      1, 0, 0, 0, value,
                      0, 1, 0, 0, value,
                      0, 0, 1, 0, value,
                      0, 0, 0, 1, 0});
              return new ColorMatrixColorFilter(cmB);
          }
      

      有一个控制亮度的搜索栏。它的范围是-255到255。

       sbBrightness.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                  @Override
                  public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                      if(fromUser){
                          photoFilterView.getSource().setColorFilter(brightness(progress));
      
                     /*     Filter brightness=new Filter();
                          brightness.addSubFilter(new BrightnessSubFilter(progress));
      
                          Bitmap ouputImage = brightness.processFilter(bm);
                          photoFilterView.getSource().setImageBitmap(ouputImage);*/
                      }
                  }
      
                  @Override
                  public void onStartTrackingTouch(SeekBar seekBar) {
      
                  }
      
                  @Override
                  public void onStopTrackingTouch(SeekBar seekBar) {
                      new Handler().postDelayed(new Runnable() {
                          @Override
                          public void run() {
                              sbBrightness.setVisibility(View.GONE);
                          }
                      },1000);
      
                  }
              });
      

      希望对一些人有所帮助。

      【讨论】:

        【解决方案5】:

        您可以在 ImageView 顶部放置一个半透明视图。如何:一个有两个孩子的 FrameView,第一个是 ImageView,第二个是一个具有半透明背景的 View(只是 View)。然后你必须以编程方式修改背景不透明度。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-08-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-09
          • 2018-12-16
          • 2011-09-05
          • 1970-01-01
          相关资源
          最近更新 更多