프레임 내 이미지 마스킹 (자르기)


83

이렇게 복잡한 모양의 이미지를 보여주고 싶은 풍부한 UI 애플리케이션이 있습니다.

여기에 이미지 설명 입력

이제 내가 원하는 것은 마스크 이미지에 따라 내 이미지를 자르는 것입니다. 실제로 이미지는 동적이며 카메라 또는 갤러리 (정사각형 또는 직사각형 모양)에서 가져올 수 있으며 해당 이미지를 위와 같이 내 레이아웃 프레임에 맞출 수 있습니다.

그래서 어떻게 이것을 달성했는지 궁금하십니까? 모든 아이디어 / 힌트 환영

배경 프레임
여기에 이미지 설명 입력
마스크
여기에 이미지 설명 입력

마찬가지로

답변:


143

마침내 마스크 이미지를 변경하고 Xfermodewith를 사용하면서 해결책을 얻었습니다.Bitmap

마스크

여기에 이미지 설명 입력

 ImageView mImageView= (ImageView)findViewById(R.id.imageview_id);
 Bitmap original = BitmapFactory.decodeResource(getResources(),R.drawable.content_image);
 Bitmap mask = BitmapFactory.decodeResource(getResources(),R.drawable.mask);
 Bitmap result = Bitmap.createBitmap(mask.getWidth(), mask.getHeight(), Config.ARGB_8888);
 Canvas mCanvas = new Canvas(result);
 Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
 paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
 mCanvas.drawBitmap(original, 0, 0, null);
 mCanvas.drawBitmap(mask, 0, 0, paint);
 paint.setXfermode(null);
 mImageView.setImageBitmap(result);
 mImageView.setScaleType(ScaleType.CENTER);
 mImageView.setBackgroundResource(R.drawable.background_frame);

출력 참조

여기에 이미지 설명 입력

소스는 여기 에서 찾을 수 있습니다 .


1
안녕하세요 @hotveryspicy, 예를 들어 코드 감사합니다. 많은 도움이되었습니다. 나는 몇 가지 문제에 직면하고 있습니다. 약간의 힌트가 나를 위해 먼 길을 갈 것입니다. 그려진 다각형 모양으로 비트 맵을 자르고 싶습니다. 내 비트 맵은 다각형 모양으로 잘리지 만 잘린 비트 맵의 ​​내용은 원래 비트 맵의 ​​0,0 왼쪽 상단에서 가져옵니다. 그리고 다각형이 그려지는 아래에 콘텐츠를 원합니다.
Dory

@Nidhi는 동일한 크기의 비트 맵을 만들 수 있습니다.
Mohammed Azharuddin Shaikh

@hotveryspicy 답장을 보내 주셔서 감사합니다. 사실 나는 여기에 주어진 것과 같은 것을하고 싶다. stackoverflow.com/questions/15969028/... . 내 문제는 잘린 비트 맵이 왼쪽 상단 즉 0,0에서 자른다는 것입니다. 내가 지정한 경로를 형성하지 않습니다. 나는 또한 코드를 넣었다. 내가 어디로 잘못 가고 있는지 알려주세요.
Dory

: 누구를위한 감사 @hotveryspicy는 그것을 필요로하는, 나는 마스크의 크기로 이미지 캔 도움말 규모있는 간단한 포크 만든 github.com/worker8/MaskImage/tree/master가
나는 개구리 용 해요

1
이미지에 맞게 마스크의 크기를 조정하려면 다음 줄을 사용합니다. Bitmap resized = Bitmap.createScaledBitmap (mask, original.getWidth (), original.getHeight (), true); 그리고 mCanvas.drawBitmap (original, 0, 0, null); mCanvas.drawBitmap (크기 조정, 0, 0, 페인트);
미구엘

5

Picasso 라이브러리와 사용자 지정 변환을 사용하면 훨씬 더 쉽습니다.

MaskTransformation.java :

 * ORIGINAL:
 * Copyright (C) 2015 Wasabeef
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package me.monori.example.utilities;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.drawable.Drawable;
import android.support.v4.content.ContextCompat;

import com.squareup.picasso.Transformation;

public class MaskTransformation implements Transformation {

    private static Paint mMaskingPaint = new Paint();
    private Context mContext;
    private int mMaskId;

    static {
        mMaskingPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
    }

    /**
     * @param maskId If you change the mask file, please also rename the mask file, or Glide will get
     * the cache with the old mask. Because getId() return the same values if using the
     * same make file name. If you have a good idea please tell us, thanks.
     */
    public MaskTransformation(Context context, int maskId) {
        mContext = context.getApplicationContext();
        mMaskId = maskId;
    }

    @Override public Bitmap transform(Bitmap source) {
        int width = source.getWidth();
        int height = source.getHeight();

        Bitmap result = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

        Drawable mask = getMaskDrawable(mContext, mMaskId);

        Canvas canvas = new Canvas(result);
        mask.setBounds(0, 0, width, height);
        mask.draw(canvas);
        canvas.drawBitmap(source, 0, 0, mMaskingPaint);

        source.recycle();

        return result;
    }

    @Override public String key() {
        return "MaskTransformation(maskId=" + mContext.getResources().getResourceEntryName(mMaskId)
                + ")";
    }

    public Drawable getMaskDrawable(Context context, int maskId) {
        Drawable drawable = ContextCompat.getDrawable(context, maskId);

        if (drawable == null) {
            throw new IllegalArgumentException("maskId is invalid");
        }

        return drawable;
    }
}

그런 다음 간단히 한 줄로 정의합니다.

Picasso.with(context)
                    .load(imageUrl)
                    .transform(new MaskTransformation(context, _maskDrawableId))
                    .placeholder(R.drawable.drawableId)
                    .into(imageView);

1
     final ImageView mImageView = (ImageView) findViewById(R.id.image);
     mImageView.setBackgroundResource(R.drawable.user_outer_circle_icon);


     mImageView.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {


            if(b){
                 mImageView.setBackgroundResource(R.drawable.profil_circle);

                 Bitmap original = BitmapFactory.decodeResource(getResources(),R.drawable.doge);

                 Bitmap mask = BitmapFactory.decodeResource(getResources(),R.drawable.mask_white);

                 Bitmap mask1 = BitmapFactory.decodeResource(getResources(),R.drawable.pencil_bg);

                 original = Bitmap.createScaledBitmap(original, mask.getWidth(),mask.getHeight(), true);

                 Bitmap result = Bitmap.createBitmap(mask.getWidth(), mask.getHeight(),Config.ARGB_8888);
                 Canvas mCanvas = new Canvas(result);
                 Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
                 paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
                 mCanvas.drawBitmap(original, 0, 0, null);
                 mCanvas.drawBitmap(mask, 0, 0, paint);
                 mCanvas.drawBitmap(mask1, 0, 0, null);
                 Bitmap mask2 = BitmapFactory.decodeResource(getResources(), R.drawable.ic_pencil);
                 mCanvas.drawBitmap(mask2, 0, 0, null);
                 mImageView.setImageBitmap(result);
                 mImageView.setScaleType(ScaleType.FIT_XY);

                 b=false;
             }else{
                 ImageView mImageView = (ImageView) findViewById(R.id.image);
                 Bitmap original = BitmapFactory.decodeResource(getResources(),
                 R.drawable.doge);

                 Bitmap mask = BitmapFactory.decodeResource(getResources(),
                 R.drawable.mask_white);

                 original = Bitmap.createScaledBitmap(original, mask.getWidth(),
                 mask.getHeight(), true);

                 Bitmap result = Bitmap.createBitmap(mask.getWidth(), mask.getHeight(),
                 Config.ARGB_8888);
                 Canvas mCanvas = new Canvas(result);
                 Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
                 paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
                 mCanvas.drawBitmap(original, 0, 0, null);
                 mCanvas.drawBitmap(mask, 0, 0, paint);
                 paint.setXfermode(null);
                 mImageView.setImageBitmap(result);
                 mImageView.setScaleType(ScaleType.FIT_XY);
                // mImageView.setBackgroundResource(R.drawable.user_outer_circle_icon);
                 b= true;


             }


        }
    });

0

이 예에서는 "animation_mask"마스크로 하위 요소 (Imageview)를 마스킹합니다.

<com.christophesmet.android.views.maskableframelayout.MaskableFrameLayout
android:id="@+id/frm_mask_animated"
android:layout_width="100dp"
app:porterduffxfermode="DST_IN"
app:mask="@drawable/animation_mask"
android:layout_height="100dp">

<ImageView android:layout_width="match_parent"
           android:layout_height="match_parent"
           android:scaleType="centerCrop"
           android:src="@drawable/unicorn"/>

이 자식 링크 확인

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.