【问题标题】:error with setPixelssetPixels 错误
【发布时间】:2011-10-09 12:58:07
【问题描述】:

我正在尝试编辑图像。但我遇到了 setPixels 错误。

        picw = pic.getWidth();
        pich = pic.getHeight();
        picsize = picw*pich;        
        int[] pix = new int [picsize];
        pic.getPixels(pix, 0, picw, 0, 0, picw, pich);  
        pic.setPixels(pix,0,pic.getWidth(),0,0,pic.getWidth(),pic.getHeight());

但我使用 setPixels 得到非法状态异常

Caused by: java.lang.IllegalStateException
  at android.graphics.Bitmap.setPixels(Bitmap.java:878)
  at com.sandyapps.testapp.testapp.onCreate(testapp.java:66)

【问题讨论】:

标签: android image-processing


【解决方案1】:

很可能您的pic 是不可变的。默认情况下,从 drawable 创建的任何位图都是不可变的。

如果您需要修改现有位图,您应该执行以下操作:

// Create a bitmap of the same size
Bitmap newBmp = Bitmap.createBitmap(pic.getWidth(), pic.getHeight(), Config.ARGB);
// Create a canvas  for new bitmap
Canvas c = new Canvas(newBmp); 

// Draw your old bitmap on it. 
c.drawBitmap(pic, 0, 0, new Paint());

【讨论】:

  • Config.ARGB_8888 可能是必需的。 Config.ARGB 给了我一个“无法解析符号”的错误。
【解决方案2】:

我认为您的Bitmap 是不可变的(请参阅setPixel()'s documentation)。

如果是这样,请创建此位图的可变副本(以 Bitmap.copy(Bitmap.Config config, boolean isMutable) 为例)并处理此副本。

【讨论】:

    【解决方案3】:

    很简单,只需使用以下命令将其更改为可变位图即可:

    myBitmap = myBitmap.copy( Bitmap.Config.ARGB_8888 , true);
    

    现在位图myBitmap 被相同的位图替换,但这次是可变的

    您还可以选择另一种存储像素的方式(ARGB_8888 等): https://developer.android.com/reference/android/graphics/Bitmap.Config.html

    【讨论】:

    • bitmap = bitmap.copy(bitmap.getConfig(), true);
    【解决方案4】:

    我遇到了同样的问题。用来修复它:

    BitmapFactory.Options opt = new BitmapFactory.Options();
    opt.inMutable = true;
    Bitmap bitmap = BitmapFactory.decodeResource( getResources(), R.drawable.my_bitmap, opt );
    

    【讨论】:

      【解决方案5】:

      我遇到了这个问题,经过很长时间终于解决了。

      public static void filterApply(Filter filter){
          Bitmap bitmcopy = PhotoModel.getInstance().getPhotoCopyBitmap();
          //custom scalling is important to apply filter otherwise it will not apply on image
          Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmcopy, bitmcopy.getWidth()-1, bitmcopy.getHeight()-1, false);
          filter.processFilter(scaledBitmap);
          filterImage.setImageBitmap(scaledBitmap);
      }
      

      【讨论】:

        猜你喜欢
        • 2013-10-01
        • 2011-06-15
        • 2022-08-06
        • 1970-01-01
        • 2015-02-07
        • 2015-03-05
        • 1970-01-01
        • 2018-06-06
        • 1970-01-01
        相关资源
        最近更新 更多