Android рисува изображение в друго изображение

как да използвате Canvas за рисуване на изображение вътре в друго изображение; така, погледнете снимката: въведете описание на изображението тук

да го поставите в приложение за карта v2 като това

 marker = gmap.addMarker(new MarkerOptions().title("test")
                        .position(new LatLng(0, 0))
                        .snippet("snipet test")
                        .icon(BitmapDescriptorFactory.fromBitmap(bitmap))

Вече рисувам картина в правоъгълник като този

            InputStream inputStream = connection.getInputStream();
            Bitmap bitmap = BitmapFactory.decodeStream(inputStream);//Convert to bitmap
            Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
                    bitmap.getHeight(), Bitmap.Config.ARGB_8888);
            Canvas canvas = new Canvas(output);

            final int color = 0xff424242;
            final Paint paint = new Paint();
            final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
            final RectF rectF = new RectF(rect);


            paint.setAntiAlias(true);
            canvas.drawARGB(0, 0, 0, 0);
            paint.setColor(color);
            canvas.drawOval(rectF, paint);

            paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
            canvas.drawBitmap(bitmap, rect, rect, paint);

как да направя това, моля, помогнете ми


person toufik3119    schedule 15.04.2014    source източник


Отговори (2)


Задайте път за изрязване за вашето платно с формата на рамката, която желаете:

Path frame = new Path();
frame.addCircle(centerX, centerY, radius, Direction.CW);
canvas.getClipBounds(oldClipBounds); //see below
canvas.clipPath(frame);

Всичко, което нарисувате в платното след това, няма да се вижда, ако е извън кръга.

Ако имате нужда от допълнително чертане, което трябва да се извърши само извън тази рамка, можете да го защитите по-късно чрез:

canvas.clipRect(oldClipBounds, Region.Op.REVERSE_DIFFERENCE);
person user2808624    schedule 16.04.2014

Намерих решение за този проблем: поставяте изображението в кръг с платно, след което преоразмерявате резултата с точния размер и го поставяте в изображението на маркера.

public class IconMarker {
    public IconMarker(){}

    public Bitmap DrawMarker(String userid,int typeid,Resources rcs){

        //  image from database: ...InputStream inputStream = connection.getInputStream();
        //Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
        Bitmap img1=new UserInfoBd().getPhotoProfil(userid);
        if(img1==null) img1=BitmapFactory.decodeResource(rcs,R.drawable.espace_photo);
        Bitmap.Config conf = Bitmap.Config.ARGB_8888;
        Bitmap bmp = BitmapFactory.decodeResource(rcs,
                typeid);
        Bitmap output = Bitmap.createBitmap(bmp.getWidth(),
                bmp.getHeight(), Bitmap.Config.ARGB_8888);

        Canvas canvas1 = new Canvas(output);
        canvas1.drawBitmap(bmp, 0,0, null);
        Bitmap output1 = Bitmap.createBitmap(img1.getWidth(),
                img1.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(output1);

        final int color = 0xff424242;
        final Paint paint = new Paint();
        final Rect rect = new Rect(0, 0, img1.getWidth(), img1.getHeight());
        final RectF rectF = new RectF(rect);


        paint.setAntiAlias(true);
        canvas.drawARGB(0, 0, 0, 0);
        paint.setColor(color);
        canvas.drawOval(rectF, paint);

        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        canvas.drawBitmap(img1, rect, rect, paint);
        Bitmap img=getResizedBitmap(output1,bmp.getHeight()*3/4-4,bmp.getWidth()*3/4);

        canvas1.drawBitmap(img,(float)4.7,(float)3.5,null);

        return output;

    }
    public  Bitmap getResizedBitmap(Bitmap bm, int newHeight, int newWidth) {

        int width = bm.getWidth();

        int height = bm.getHeight();

        float scaleWidth = ((float) newWidth) / width;

        float scaleHeight = ((float) newHeight) / height;

        // CREATE A MATRIX FOR THE MANIPULATION
        Matrix matrix = new Matrix();

        // RESIZE THE BIT MAP
        matrix.postScale(scaleWidth, scaleHeight);

        // RECREATE THE NEW BITMAP
        Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, false);

        return resizedBitmap;
    }
}
person toufik3119    schedule 17.04.2014