2015-05-20 11 views
8

Chciałbym zmienić obraz ImageView na czarno-biały. Jedyną rzeczą jest to, że mój kod pozwala użytkownikowi na zrobienie zdjęcia, które zdjęcie zostanie umieszczone w widoku obrazu. Chciałbym, aby to zdjęcie było czarno-białe. Jeśli ktokolwiek wie, jak mógłbym to zrobić, byłbym wdzięczny.Zmiana obrazu ImageView na czarno-biały

główną działalność:

package com.example.triptych4; 

import java.io.File; 

import android.app.Activity; 
import android.content.ContentResolver; 
import android.content.Context; 
import android.content.Intent; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 
import android.provider.MediaStore; 
import android.util.Log; 
import android.view.Menu; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.BaseAdapter; 
import android.widget.Button; 
import android.widget.Gallery; 
import android.widget.ImageButton; 
import android.widget.ImageView; 
import android.widget.Toast; 

public class MainActivity extends Activity { 


    // label our logs "CameraApp3" 
    private static String logtag = "CameraApp3"; 
    // tells us which camera to take a picture from 
    private static int TAKE_PICTURE = 1; 
    // empty variable to hold our image Uri once we store it 
    private Uri imageUri; 

    private Integer[] pics = { R.drawable.android, R.drawable.android3d, 
      R.drawable.background3 }; 

    private ImageView imageView; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Gallery gallery = (Gallery) findViewById(R.id.gallery1); 
     gallery.setAdapter(new ImageAdapter(this)); 
     imageView = (ImageView) findViewById(R.id.imageView1); 

     gallery.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
        long arg3) { 
       Toast.makeText(getApplicationContext(), "pic:" + arg2, 
         Toast.LENGTH_SHORT).show(); 
       imageView.setImageResource(pics[arg2]); 
      } 
     }); 


     // look for the button we set in the view 
     ImageButton cameraButton = (ImageButton) 
       findViewById(R.id.button_camera); 
     // set a listener on the button 
     cameraButton.setOnClickListener(cameraListener); 

    } 




    // set a new listener 
    private OnClickListener cameraListener = new OnClickListener() { 
     public void onClick(View v) { 
      // open the camera and pass in the current view 
      takePhoto(v); 
     } 
    }; 

    public void takePhoto(View v) { 
     // tell the phone we want to use the camera 
     Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); 
     // create a new temp file called pic.jpg in the "pictures" storage area of the phone 
     File photo = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "pic.jpg"); 
     // take the return data and store it in the temp file "pic.jpg" 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo)); 
     // stor the temp photo uri so we can find it later 
     imageUri = Uri.fromFile(photo); 
     // start the camera 
     startActivityForResult(intent, TAKE_PICTURE); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    public class ImageAdapter extends BaseAdapter{ 
     private Context context; 
     int imageBackground; 

     public ImageAdapter(Context context){ 
      this.context = context; 
     } 

     @Override 
     public int getCount() { 
      // TODO Auto-generated method stub 
      return pics.length; 
     } 

     @Override 
     public Object getItem(int arg0) { 
      // TODO Auto-generated method stub 
      return arg0; 
     } 

     @Override 
     public long getItemId(int arg0) { 
      // TODO Auto-generated method stub 
      return arg0; 
     } 

     @Override 
     public View getView(int arg0, View arg1, ViewGroup arg2) { 
      // TODO Auto-generated method stub 
      ImageView imageView =new ImageView(context); 
      imageView.setImageResource(pics[arg0]); 
      return imageView; 
     } 
    } 
    // override the original activity result function 
    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     // call the parent 
     super.onActivityResult(requestCode, resultCode, data); 
     switch(requestCode) { 
     // if the requestCode was equal to our camera code (1) then... 
     case 1: 
      // if the user took a photo and selected the photo to use 
      if(resultCode == Activity.RESULT_OK) { 
       // get the image uri from earlier 
       Uri selectedImage = imageUri; 
       // notify any apps of any changes we make 
       getContentResolver().notifyChange(selectedImage, null); 
       // get the imageView we set in our view earlier 
       ImageButton imageButton = (ImageButton)findViewById(R.id.button_camera); 
       // create a content resolver object which will allow us to access the image file at the uri above 
       ContentResolver cr = getContentResolver(); 
       // create an empty bitmap object 
       Bitmap bitmap; 
       try { 
        // get the bitmap from the image uri using the content resolver api to get the image 
        bitmap = android.provider.MediaStore.Images.Media.getBitmap(cr, selectedImage); 
        // set the bitmap to the image view 
        imageButton.setImageBitmap(bitmap); 
        // notify the user 
        Toast.makeText(MainActivity.this, selectedImage.toString(), Toast.LENGTH_LONG).show(); 
       } catch(Exception e) { 
        // notify the user 
        Toast.makeText(MainActivity.this, "failed to load", Toast.LENGTH_LONG).show(); 
        Log.e(logtag, e.toString()); 
       } 
      } 


     } 


    } 



} 

Układ:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.example.triptych5.MainActivity" > 

    <ImageView 
     android:id="@+id/imageView1" 
     android:layout_width="200dp" 
     android:layout_height="200dp" 
     android:scaleType="fitXY" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentRight="true" 
     android:layout_alignTop="@+id/button_camera"/> 

    <ImageButton 
     android:id="@+id/button_camera" 
     android:layout_width="230dp" 
     android:layout_height="235dp" 
     android:scaleType="fitXY" 
     android:rotation="-90" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true" 
     android:background="@drawable/middle4" /> 

    <Gallery 
     android:id="@+id/gallery1" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_above="@+id/imageView1" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" /> 

</RelativeLayout> 

Odpowiedz

24

Można to osiągnąć po prostu wykonując:

ImageView imageview = (ImageView) findViewById(R.id.imageView1); 
ColorMatrix matrix = new ColorMatrix(); 
matrix.setSaturation(0); 

ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix); 
imageview.setColorFilter(filter); 
+0

Dzięki stary! działa towar :) – Harrison

+0

Cieszę się, że pomógł :) –

+0

jest domyślnym satuation 100? – jonney

2

Można użyć android.graphics.ColorFilter do celu.

Możesz użyć tej próbki, aby zaspokoić swoje potrzeby. Przepuścić imageView metody setBW jak

setBW(imageView); 

i funkcjonalności jest

private void setBW(ImageView iv){ 

    float brightness = 10; // change values to suite your need 

    float[] colorMatrix = { 
      0.33f, 0.33f, 0.33f, 0, brightness, 
      0.33f, 0.33f, 0.33f, 0, brightness, 
      0.33f, 0.33f, 0.33f, 0, brightness, 
      0, 0, 0, 1, 0  
      }; 

    ColorFilter colorFilter = new ColorMatrixColorFilter(colorMatrix); 
     iv.setColorFilter(colorFilter); 
    } 

Spróbuj użyć tego. Wszelkie obawy. Daj mi znać. Dzięki.