0

こんにちは、アンドロイドで画像のぼかしを実装しようとしています

private Bitmap getBlurBitmap(Bitmap bitmap, int radius)
    {
        int w,h,total;

        if(bitmap == null){
            System.err.println(" <== BitMap is Null ==> ");
            return null;
        }

        w=bitmap.getWidth();
        h=bitmap.getHeight();

         for (int y = 0; y < h; ++y) {
             for (int x = 0; x < w; ++x) {
                 total = 0;
                 for (int ky = -radius; ky <= radius; ++ky){
                     for (int kx = -radius; kx <= radius; ++kx){
                        // total += source(x + kx, y + ky);

                         int _tempx=x + kx;
                         int _tempy=y + ky;

                         if(_tempx < 0 )
                             _tempx=0;
                         if(_tempx > w )
                            _tempx = w - kx;

                         if(_tempy < 0 )
                             _tempy=0;
                         if(_tempy > h )
                             _tempy = h - ky;

                         total += bitmap.getPixel(_tempx, _tempy);
                     }
                 }
                 bitmap.setPixel(x, y,(int)( total / (radius * 2 + 1) ^ 2));
             }
         }
        return bitmap;
    }

しかし、これを実行しようとすると、次FATAL EXCEPTIONのように表示されます

03-18 04:41:54.296: E/AndroidRuntime(16347): FATAL EXCEPTION: main
03-18 04:41:54.296: E/AndroidRuntime(16347): java.lang.IllegalStateException
03-18 04:41:54.296: E/AndroidRuntime(16347):    at android.graphics.Bitmap.setPixel(Bitmap.java:856)
03-18 04:41:54.296: E/AndroidRuntime(16347):    at com.org.PhotoAppSimpleBlureActivity.getBlurBitmap(PhotoAppSimpleBlureActivity.java:81)
03-18 04:41:54.296: E/AndroidRuntime(16347):    at com.org.PhotoAppSimpleBlureActivity.onClick(PhotoAppSimpleBlureActivity.java:93)
03-18 04:41:54.296: E/AndroidRuntime(16347):    at android.view.View.performClick(View.java:2485)
03-18 04:41:54.296: E/AndroidRuntime(16347):    at android.view.View$PerformClick.run(View.java:9080)
03-18 04:41:54.296: E/AndroidRuntime(16347):    at android.os.Handler.handleCallback(Handler.java:587)
03-18 04:41:54.296: E/AndroidRuntime(16347):    at android.os.Handler.dispatchMessage(Handler.java:92)
03-18 04:41:54.296: E/AndroidRuntime(16347):    at android.os.Looper.loop(Looper.java:130)
03-18 04:41:54.296: E/AndroidRuntime(16347):    at android.app.ActivityThread.main(ActivityThread.java:3683)
03-18 04:41:54.296: E/AndroidRuntime(16347):    at java.lang.reflect.Method.invokeNative(Native Method)
03-18 04:41:54.296: E/AndroidRuntime(16347):    at java.lang.reflect.Method.invoke(Method.java:507)
03-18 04:41:54.296: E/AndroidRuntime(16347):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:850)
03-18 04:41:54.296: E/AndroidRuntime(16347):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
03-18 04:41:54.296: E/AndroidRuntime(16347):    at dalvik.system.NativeStart.main(Native Method)

何が間違っているのか、何が欠けているのかわかりません。この例を参照してください。

4

3 に答える 3

3

ドキュメントでは、不変の場合にsetPixelスローされることがわかります。可変ビットマップが必要です。1つを取得する簡単な方法(多くのうちの1つ)は次のとおりです。IllegalStateExceptionBitmap

bitmap = bitmap.copy(bitmap.getConfig(), true);
于 2012-10-25T10:52:55.157 に答える
0
 bitmap.setPixel(x, y,(int)( total / (radius * 2 + 1) ^ 2));

上記のコードをこのように置きます

try
        {
             bitmap.setPixel(x, y,(int)( total / (radius * 2 + 1) ^ 2));
        }

        catch (IllegalStateException e) {
            // TODO: handle exception
        }
        catch (Exception e) {
            // TODO: handle exception
        }

うまくいきますように……。

于 2012-10-25T10:49:49.923 に答える