Android - 是否可以直接在图层列表XML定义中声明alpha掩码?

Shl*_*rtz 31 png android alphablending mask android-layout

一个新手问题

我有这个layer.xml,我用它作为ImageView的源.还有两个图像,mask.png和image.jpg

layers.xml:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <bitmap  android:src="@drawable/image" android:gravity="center"/>
    </item>
    <item>
        <bitmap  android:src="@drawable/mask" android:gravity="center"/>
    </item>
</layer-list>
Run Code Online (Sandbox Code Playgroud)

ImageView的:

<ImageView
 android:id="@+id/img_B"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:src="@drawable/layers"/>
Run Code Online (Sandbox Code Playgroud)

目前输出只是图像上的png.我希望png充当面具,使用png alpha通道剪切图像,如下所示: 在此输入图像描述

这可能直接在xml中,或者我必须通过代码来完成吗?

谢谢你的建议 ;)

更新:目前我使用代码替换整个ImageView实现了我的目标

ImageView img = (ImageView) findViewById(imgID);

Canvas canvas = new Canvas();
Bitmap mainImage = BitmapFactory.decodeResource(getResources(), R.drawable.img);
Bitmap mask = BitmapFactory.decodeResource(getResources(), R.drawable.mask);
Bitmap result = Bitmap.createBitmap(mainImage.getWidth(), mainImage.getHeight(), Bitmap.Config.ARGB_8888);

canvas.setBitmap(result);
Paint paint = new Paint();
paint.setFilterBitmap(false);

canvas.drawBitmap(mainImage, 0, 0, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
canvas.drawBitmap(mask, 0, 0, paint);
paint.setXfermode(null);

img.setImageBitmap(result);
img.invalidate();
Run Code Online (Sandbox Code Playgroud)

Fat*_*tie 7

将您的蒙版图像放在drawable-nodpi文件夹中.

否则,缩放将是错误的.

这是来自应用程序的一些示例代码.在相机之后它添加了一个面具.

public void onActivityResult(int requestCode, int resultCode, Intent data)
  {
  if (requestCode == REQUEST_IMAGE_CAPTURE) // && resultCode == RESULT_OK )
    {

    try
      {
      Bitmap cameraBmp = MediaStore.Images.Media.getBitmap(
          State.mainActivity.getContentResolver(),
          Uri.fromFile(Utils.tempFileForAnImage())
                                );

      cameraBmp = ThumbnailUtils.extractThumbnail(cameraBmp, 256, 256);

      Matrix m = new Matrix();
      m.postRotate(Utils.neededRotation(Utils.tempFileForAnImage()));
      // NOTE incredibly useful trick for cropping/resizing square
      // http://stackoverflow.com/a/17733530/294884

      cameraBmp = Bitmap.createBitmap(cameraBmp,
          0, 0, cameraBmp.getWidth(), cameraBmp.getHeight(),
          m, true);


      // so, cameraBmp is now a Bitmap.  Let's add the mask!!
      // see Shiomi Schwartz's original!! http://stackoverflow.com/questions/8630365

      Bitmap mask = BitmapFactory.decodeResource(
            getResources(),
            R.drawable.mask_android_256);
      // NOTE THE MASK ** MUST ** BE IN YOUR nodpi folder

      Bitmap result = Bitmap.createBitmap( 256,256, Bitmap.Config.ARGB_8888);

      Canvas cc = new Canvas();
      cc.setBitmap(result);

      Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
      paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));

      cc.drawBitmap(cameraBmp, 0, 0, null);
      cc.drawBitmap(mask, 0,0, paint);

      // so, cameraBmp is now a Bitmap but it has been masked



      yourImageViewForTheUser.setImageBitmap(result);

      // make a "baos" ... we want PNG in this case ..
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      result.compress(Bitmap.CompressFormat.PNG, 0, baos);

      imageBytesRESULT = baos.toByteArray();
      // typically you want the result as image bytes, example to send to Parse

      } catch (FileNotFoundException e)
      {
      e.printStackTrace();
      } catch (IOException e)
      {
      e.printStackTrace();
      }

    return;
    }

  }
Run Code Online (Sandbox Code Playgroud)


小智 -1

.png文件在创建时可以包含 Alpha 通道,Android 可以使用它来隔离图像,如您所解释的。

在 GIMP 或 Photoshop 或您使用的任何图像编辑器中创建一个额外的通道。这将是一个单色通道(256 种白色到黑色的色调)。选择要屏蔽的部分,单击 Alpha 通道并用黑色填充选择区域。反转选区,仍然在 Alpha 通道中,并用白色填充它。将文件保存并导出.png为带 alpha 的 24 位(实际上是 32 位)。您的文件应该正确呈现。

  • 创建 alpha 通道图像很容易,我问如何使用这个 alpha 通道作为遮罩 (4认同)