【问题标题】:How to work with Bitmap(Effects) in Android?如何在 Android 中使用位图(效果)?
【发布时间】:2014-01-13 08:16:21
【问题描述】:

我想为 Android 中的图像添加一些效果。我在Aviary 中导入库文件。我只是 Android 开发的新手。任何人都可以提供一个关于如何使用库文件中的方法的小例子吗?提前致谢。各位圣诞快乐。我还尝试了来自here 的示例。但是我对实现这个例子感到困惑。

代码:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iv = (ImageView) findViewById(R.id.butterfly_image);
        iv.setImageBitmap(src);
        Button b = (Button) findViewById(R.id.button);
        b.setOnClickListener(this);
    }

public void onClick(View arg0) {
    iv = (ImageView) findViewById(R.id.butterfly_image);
    System.out.println("Inside onClick()");
    src = doHighlightImage(src);
    System.out.println("doHighlightImage has been passed");
    iv.setImageBitmap(src);
} 

public static Bitmap doHighlightImage(Bitmap src) {
        // create new bitmap, which will be painted and becomes result image
        Bitmap bmOut = Bitmap.createBitmap(src.getWidth() + 96, src.getHeight() + 96, Bitmap.Config.ARGB_8888);
        // setup canvas for painting
        Canvas canvas = new Canvas(bmOut);
        // setup default color
        canvas.drawColor(0, PorterDuff.Mode.CLEAR);

        // create a blur paint for capturing alpha
        Paint ptBlur = new Paint();
        ptBlur.setMaskFilter(new BlurMaskFilter(15, Blur.NORMAL));
        int[] offsetXY = new int[2];
        // capture alpha into a bitmap
        Bitmap bmAlpha = src.extractAlpha(ptBlur, offsetXY);
        // create a color paint
        Paint ptAlphaColor = new Paint();
        ptAlphaColor.setColor(0xFFFFFFFF);
        // paint color for captured alpha region (bitmap)
        canvas.drawBitmap(bmAlpha, offsetXY[0], offsetXY[1], ptAlphaColor);
        // free memory
        bmAlpha.recycle();

        // paint the image source
        canvas.drawBitmap(src, 0, 0, null);

        // return out final image
        return bmOut;
    }

我不确定上述代码的实现是对还是错。它没有按预期执行,所以我猜它错了。我的 logcat 在调用该方法时显示 NullPointerException。

Logcat:

12-25 16:14:45.150: I/System.out(13695): Inside onClick()
12-25 16:14:45.150: W/dalvikvm(13695): threadid=1: thread exiting with uncaught exception (group=0x4118d438)
12-25 16:14:45.160: E/AndroidRuntime(13695): FATAL EXCEPTION: main
12-25 16:14:45.160: E/AndroidRuntime(13695): java.lang.NullPointerException
12-25 16:14:45.160: E/AndroidRuntime(13695):    at com.example.effects.MainActivity.doHighlightImage(MainActivity.java:47)
12-25 16:14:45.160: E/AndroidRuntime(13695):    at com.example.effects.MainActivity.onClick(MainActivity.java:41)
12-25 16:14:45.160: E/AndroidRuntime(13695):    at android.view.View.performClick(View.java:4101)
12-25 16:14:45.160: E/AndroidRuntime(13695):    at android.view.View$PerformClick.run(View.java:17082)
12-25 16:14:45.160: E/AndroidRuntime(13695):    at android.os.Handler.handleCallback(Handler.java:615)
12-25 16:14:45.160: E/AndroidRuntime(13695):    at android.os.Handler.dispatchMessage(Handler.java:92)
12-25 16:14:45.160: E/AndroidRuntime(13695):    at android.os.Looper.loop(Looper.java:137)
12-25 16:14:45.160: E/AndroidRuntime(13695):    at android.app.ActivityThread.main(ActivityThread.java:4954)
12-25 16:14:45.160: E/AndroidRuntime(13695):    at java.lang.reflect.Method.invokeNative(Native Method)
12-25 16:14:45.160: E/AndroidRuntime(13695):    at java.lang.reflect.Method.invoke(Method.java:511)
12-25 16:14:45.160: E/AndroidRuntime(13695):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798)
12-25 16:14:45.160: E/AndroidRuntime(13695):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:565)
12-25 16:14:45.160: E/AndroidRuntime(13695):    at dalvik.system.NativeStart.main(Native Method)

我还从 StackOverFlow 的某些帖子中了解到,http://xjaphx.wordpress.com 中的一些示例没有按预期工作。任何帮助将不胜感激。 圣诞快乐。

【问题讨论】:

  • src 是位图变量。
  • 您是否为您的位图分配了任何图像?
  • 不需要在onClick中重新初始化imageview,它已经在onCreate初始化了
  • 不,我没有任何图像位图,但我在 ImageView 中有一个图像并通过 iv.setImageBitmap(src) 将其设置为位图。但不确定它是否会起作用。
  • @San 第 47 行是什么MainActivity.java

标签: android bitmap image-enhancement


【解决方案1】:

我猜你src 位图变量为空。您需要按如下方式分配图像:并且您不需要初始化您的ImageView 两次,因为您已经在onCreate() 中声明了它

改变你的onClick代码如下:

要从您的ImageView 获取图像,您需要获取如下图像:

Bitmap src= ((BitmapDrawable)iv.getDrawable()).getBitmap();

public void onClick(View arg0) {

     System.out.println("Inside onClick()");
    src = doHighlightImage(src);
    System.out.println("doHighlightImage has been passed");
    iv.setImageBitmap(src);
} 

【讨论】:

  • 现在实施。会让你知道结果。
  • 成功了。谢谢朋友。我还有另一个疑问可以吗?
  • @San 是的,告诉我你有什么疑问?
  • 当我尝试重复这些效果时,我得到了 OutofMemoryException,我相信这在使用 Bitmap 时是正常的。我浏览并找到了youtube.com/watch?v=rsQet4nBVi8 链接。如果我在单个活动中添加多个效果,会导致异常吗?上面提到的链接仅适用于相同大小的位图图像,但我想将这些效果添加到用户动态拍摄的照片中。是否可以避免异常??
  • 它实际上是可能的,但你不能完全忽略这个错误。在处理图像时,您将始终面临此错误。并且可以通过调整图像大小并减小其大小来解决。
【解决方案2】:

你可以在这里看到我的答案。有效地处理你的位图会很有用。

How to make application more responsive which uses several bitmaps?

【讨论】:

  • 感谢 Kailash,确实很有帮助。
猜你喜欢
  • 2023-03-17
  • 1970-01-01
  • 2012-02-21
  • 2013-05-17
  • 1970-01-01
  • 2012-03-11
  • 2012-07-02
  • 2015-12-21
  • 1970-01-01
相关资源
最近更新 更多