2013-12-03 5 views
1
testButton.setOnClickListener(new Button.OnClickListener(){ 

     @Override 
     public void onClick(View v) 
     { 
      Bitmap mutableBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);for (int i = 0; i < mutableBitmap.getWidth(); i++) 
       { 
        for (int j = 0; j < mutableBitmap.getHeight(); j++) 
        { 
         int pixel = mutableBitmap.getPixel(i, j); 
         // get red color value 
         int red = Color.red(pixel); 
         int color = Color.argb(0xFF, red, 0, 0); 
         mutableBitmap.setPixel(i, j, color); 
         imageView.setImageBitmap(mutableBitmap); 
        } 
       } 
     } 


     }); 

Я пытаюсь изменить цвет пикселя только с красным значением. Поэтому я получаю красное значение от заданного пикселя, а затем пытаюсь заменить один и тот же пиксель только на это красное значение. Программа работает успешно, но когда я нажимаю кнопку, она вылетает. Может кто-нибудь сказать мне, что я делаю неправильноИзменение цвета пикселов в android

ошибку LogCat

12-03 15:16:57.228: E/AndroidRuntime(5103): FATAL EXCEPTION: main 
12-03 15:16:57.228: E/AndroidRuntime(5103): java.lang.IllegalStateException 
12-03 15:16:57.228: E/AndroidRuntime(5103): at android.graphics.Bitmap.setPixel(Bitmap.java:1002) 
12-03 15:16:57.228: E/AndroidRuntime(5103): at com.example.imaging.AndroidCamera$7.onClick(AndroidCamera.java:216) 
12-03 15:16:57.228: E/AndroidRuntime(5103): at android.view.View.performClick(View.java:3511) 
12-03 15:16:57.228: E/AndroidRuntime(5103): at android.view.View$PerformClick.run(View.java:14109) 
12-03 15:16:57.228: E/AndroidRuntime(5103): at android.os.Handler.handleCallback(Handler.java:605) 
12-03 15:16:57.228: E/AndroidRuntime(5103): at android.os.Handler.dispatchMessage(Handler.java:92) 
12-03 15:16:57.228: E/AndroidRuntime(5103): at android.os.Looper.loop(Looper.java:137) 
12-03 15:16:57.228: E/AndroidRuntime(5103): at android.app.ActivityThread.main(ActivityThread.java:4424) 
12-03 15:16:57.228: E/AndroidRuntime(5103): at java.lang.reflect.Method.invokeNative(Native Method 
12-03 15:16:57.228: E/AndroidRuntime(5103): at java.lang.reflect.Method.invoke(Method.java:511) 
12-03 15:16:57.228: E/AndroidRuntime(5103): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
12-03 15:16:57.228: E/AndroidRuntime(5103): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
12-03 15:16:57.228: E/AndroidRuntime(5103): at dalvik.system.NativeStart.main(Native Method) 
+1

Какая ошибка? опубликуйте свой logcat –

+0

Я обновил ошибки logcat. Что-то не так пошло с строкой bitmap.setPixel (400, 200, цвет); – Aswathy

ответ

8

Вы пытаетесь изменить пиксели неизменяемого битового массива. Вы не можете изменять пиксели неизменяемого растрового изображения. если вы попробуете, это вызовет IllegalStateException.

использования ниже метода, чтобы получить Мутабельную Картинку из ресурсов

public static Bitmap getMutableBitmap(Resources resources,int resId) { 
    BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inMutable = true; 
    return BitmapFactory.decodeResource(resources, resId, options); 
} 

или использовать

Bitmap mutableBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true); 

получить изменяемую Картинку из неизменных растрового

+0

Я использовал эту строку Bitmap mutableBitmap = bitmap.copy (Bitmap.Config.ARGB_8888, true); программа также не показывает никаких ошибок. Мое изображение - просто черный экран. Поэтому, когда я запускаю эту программу, этот конкретный пиксель должен меняться в красный цвет. так что нужно увидеть небольшую красную точку, которая не в состоянии. Итак, как я могу убедиться, что он работает или не – Aswathy

+1

после изменения пикселя, задаете ли вы этот mutableBitmap для ImageView? используйте ImageView.setImageBitmap (mutableBitmap); –

+0

Я использовал эту строку..imageView.refreshDrawableState(); когда я использую строку, на которую вы ссылались ... показывает ошибку ... Невозможно сделать статическую ссылку на нестационарный метод – Aswathy

1

Чтение documentation, вы видите, что этот метод может бросить IllegalStateException, если вы пытаетесь установить пиксель в неизменяемой растрового изображения.

public void setPixel (int x, int y, int color) 

Added in API level 1 
Write the specified Color into the bitmap (assuming it is mutable) at the x,y coordinate. The color must be a non-premultiplied ARGB value. 

Parameters 
x The x coordinate of the pixel to replace (0...width-1) 
y The y coordinate of the pixel to replace (0...height-1) 
color The ARGB color to write into the bitmap 
Throws 
IllegalStateException if the bitmap is not mutable 
IllegalArgumentException if x, y are outside of the bitmap's bounds. 

Если вы используете один из этих createBitmap методов, большинство из них возвращается неизменные растровые изображения, так что либо использовать другой метод создателя, или получить изменяемую копию растрового изображения вы получите.

+0

Я тоже читал эту документацию ... так вот мне нужно изменить неизменяемое растровое изображение на изменчивое право? – Aswathy

0

Проверить this создать неизменность растрового ...

testButton.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      Config config = null; 
      int width = bitmap.getWidth(); 
      int height = bitmap.getHeight(); 
      if (bitmap.getConfig() == null) { 
       config = Config.ARGB_8888; 
      } else { 
       config = bitmap.getConfig(); 
      } 
      int pixel; 
      // Here you ll get the immutable Bitmap 
      Bitmap copyBitmap = bitmap.copy(config, true); 
      // scan through all pixels 
      for (int x = 0; x < width; ++x) { 
       for (int y = 0; y < height; ++y) { 
        // get pixel color 
        pixel = bitmap.getPixel(x, y); 
        if (x == 400 && y == 200) { 
         copyBitmap.setPixel(x, y, 
           Color.argb(0xFF, Color.red(pixel), 0, 0)); 
        } else { 
         copyBitmap.setPixel(x, y, pixel); 
        } 
       } 
      } 
      imageView.setImageBitmap(copyBitmap); 
     } 
}); 
Смежные вопросы