Android 如何实现搜索栏以改变对比度

Android 如何实现搜索栏以改变对比度,android,imageview,android-imageview,android-seekbar,Android,Imageview,Android Imageview,Android Seekbar,我正在尝试实现一个搜索栏来改变android中图像的对比度。有人帮我实现这个吗?还有其他的图像处理选项吗? 有人知道解决办法吗?请帮帮我 提前谢谢 代码: public class MainActivity extends ActionBarActivity { ImageView imViewAndroid; private SeekBar seekbar; @Override protected void onCreate(Bundle savedIn

我正在尝试实现一个搜索栏来改变android中图像的对比度。有人帮我实现这个吗?还有其他的图像处理选项吗? 有人知道解决办法吗?请帮帮我

提前谢谢

代码:

    public class MainActivity extends ActionBarActivity {
    ImageView imViewAndroid;
    private SeekBar seekbar;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        seekbar = (SeekBar) findViewById(R.id.seekbar);
        imViewAndroid = (ImageView) findViewById(R.id.imViewAndroid);


        seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int i, boolean b) {

            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
                imViewAndroid.setImageBitmap(takeContrast(BitmapFactory.decodeResource(getResources(), R.drawable.dicom), 100));
            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });

    }
  public  Bitmap takeContrast(Bitmap src, double value) {
        // src image size
        int width = src.getWidth();
        int height = src.getHeight();
        // create output bitmap with original size
        Bitmap bmOut = Bitmap.createBitmap(width, height, src.getConfig());
        // color information
        int A, R, G, B;
        int pixel;
        // get contrast value
        double contrast = Math.pow((100 + value) / 100, 2);

        // scan through all pixels
        for(int x = 0; x < width; ++x) {
            for(int y = 0; y < height; ++y) {
                // get pixel color
                pixel = src.getPixel(x, y);
                A = Color.alpha(pixel);
                // apply filter contrast for every channel R, G, B
                R = Color.red(pixel);
                R = (int)(((((R / 255.0) - 0.5) * contrast) + 0.5) * 255.0);
                if(R < 0) { R = 0; }
                else if(R > 255) { R = 255; }

                G = Color.red(pixel);
                G = (int)(((((G / 255.0) - 0.5) * contrast) + 0.5) * 255.0);
                if(G < 0) { G = 0; }
                else if(G > 255) { G = 255; }

                B = Color.red(pixel);
                B = (int)(((((B / 255.0) - 0.5) * contrast) + 0.5) * 255.0);
                if(B < 0) { B = 0; }
                else if(B > 255) { B = 255; }

                // set new pixel color to output bitmap
                bmOut.setPixel(x, y, Color.argb(A, R, G, B));
            }
        }

        // return final image
        return bmOut;
    }
公共类MainActivity扩展了ActionBarActivity{
ImageView-imViewAndroid;
私人SeekBar SeekBar;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
seekbar=(seekbar)findViewById(R.id.seekbar);
imviewsandroid=(ImageView)findviewbyd(R.id.imviewsandroid);
seekbar.setOnSeekbarchaneListener(新的seekbar.onSeekbarchaneListener(){
@凌驾
public void onProgressChanged(SeekBar SeekBar、int i、boolean b){
}
@凌驾
开始跟踪触摸时的公共无效(SeekBar SeekBar){
setImageBitmap(takeContrast(BitmapFactory.decodeResource(getResources(),R.drawable.dicom),100);
}
@凌驾
TopTrackingTouch(SeekBar SeekBar)上的公共无效{
}
});
}
公共位图对比度(位图src,双值){
//src图像大小
int width=src.getWidth();
int height=src.getHeight();
//使用原始大小创建输出位图
Bitmap bmOut=Bitmap.createBitmap(宽度、高度,src.getConfig());
//颜色信息
int A,R,G,B;
整数像素;
//获取对比度值
双对比度=数学功率((100+值)/100,2);
//扫描所有像素
对于(int x=0;x255){R=255;}
G=颜色。红色(像素);
G=(int)((G/255.0)-0.5)*对比度+0.5)*255.0);
如果(G<0){G=0;}
如果(G>255){G=255;}
B=颜色。红色(像素);
B=(int)((B/255.0)-0.5)*对比度+0.5)*255.0);
如果(B<0){B=0;}
如果(B>255){B=255;}
//设置新像素颜色以输出位图
设置像素(x,y,Color.argb(A,R,G,B));
}
}
//返回最终图像
返回bmOut;
}
  • 您调用该函数以在错误的位置更改对比度,它应该在这里

    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean b) {
        // call the method here, default progress is <0, 100>
    }
    
    @覆盖
    public void onProgressChanged(SeekBar-SeekBar、int-progress、布尔b){
    //在此处调用该方法,默认进度为
    }
    
  • 您使用非常慢的函数来更改对比度。StackOverflow上已经有很多答案,请查看。在询问之前搜索


  • 查看my上的完整实现。

    上面的代码处理图像花费的时间太多。如果使用my代码,则处理图像所花费的时间会非常少

    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean b) {
        contrastAndBrightnessControler(bitmap,seekbar.getProgress()/10,0.7)
    }
    
    
    public static Bitmap contrastAndBrightnessControler(Bitmap bitmap, float contrast, float brightness)
    {
        ColorMatrix cmatrix = 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 ret =Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(), bitmap.getConfig());
        Canvas canvas = new Canvas(ret);
        Paint paint = new Paint();
        paint.setColorFilter(new ColorMatrixColorFilter(cmatrix));
        canvas.drawBitmap(bitmap, 0, 0, paint);
        return ret;
    }
    

    我可以这样调用imViewAndroid.setImageBitmap(ChangeBitMapContractBrightness(0,100));如果有任何错误,请更正我:
    ChangeBitMapContractBrightness(位图,(浮点)进度/100f,0.5f)
    是否正确?位图变为红色imViewAndroid.setImageBitmap(ChangeBitContractMapBrightness(位图,(浮点)i/100f,0.5f));添加了完整项目的链接,但在实施seekbar时存在一些疑问