2011-12-25 12 views
30

एक नौसिखिया प्रश्नएंड्रॉइड - क्या लेयर-सूची एक्सएमएल परिभाषा के भीतर सीधे अल्फा मास्क घोषित करना संभव है?

मेरे पास यह layers.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> 

imageView:

<ImageView 
android:id="@+id/img_B" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:src="@drawable/layers"/> 

पल उत्पादन छवि पर सिर्फ png है पर। मैं png एक मुखौटा के रूप में कार्य करने के लिए है, तो जैसे png अल्फ़ा चैनल का उपयोग कर छवि कतरन चाहते हैं: enter image description here

सीधे कि संभव है एक्सएमएल के भीतर, या मैं कोड से यह करने के लिए क्या है?

आपकी सलाह के लिए धन्यवाद;)

अद्यतन: पल मैं अपने लक्ष्य को हासिल किया पूरे 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(); 
+0

जो मुझे यहां इंगित करने का एक अच्छा तरीका था! इस बारे में निश्चित नहीं है, लेकिन मुझे थोड़ा सा देखने दो और आपको वापस मिलें। – Shaunak

+2

आपको इसे एक स्वीकार्य उत्तर के रूप में रखना होगा क्योंकि यह सिर्फ मुझे बचाया है! – DeeV

+0

दिया गया उत्तर मूल प्रश्न का उत्तर नहीं देता है, मैं अभी भी सोच रहा हूं कि परत-सूची xml –

उत्तर

-3

.png फ़ाइलें एक अल्फ़ा चैनल शामिल जब आपने उन्हें बनाया हो सकता है को बदलने के लिए कोड का उपयोग कर पर और एंड्रॉइड उस छवि को अलग करने के लिए उपयोग कर सकता है जैसा आप समझाते हैं।

जीआईएमपी या फ़ोटोशॉप या जो भी छवि संपादक आप उपयोग करते हैं, में एक अतिरिक्त चैनल बनाएं। यह एक मोनोक्रोम चैनल (सफेद से काले रंग के 256 रंग) होगा। उस अनुभाग का चयन करें जिसे आप मुखौटा करना चाहते हैं, अल्फा चैनल पर क्लिक करें और चयन क्षेत्र को काले रंग से भरें। चयन को उलटा करें, अभी भी अल्फा चैनल में, और इसे सफेद से भरें। .png फ़ाइल को अल्फा के साथ 24 बिट के रूप में सहेजें और निर्यात करें (प्रभावी रूप से 32 बिट)। आपकी फ़ाइल सही ढंग से प्रस्तुत करना चाहिए।

+4

का उपयोग करके मास्क परत घोषित किया जा सकता है, यह अल्फा चैनल छवि बनाना आसान है, मैं इस अल्फा चैनल का उपयोग कैसे करना चाहता था एक मुखौटा –

+1

@Erik के रूप में यह कोई सवाल नहीं है: डी –

7

फ़ोल्डर में खींचने योग्य-नोडपी में अपना मुखौटा छवि रखें।

अन्यथा, स्केलिंग गलत होगी।

यहां ऐप से कुछ उदाहरण कोड है। कैमरे के बाद यह एक मुखौटा जोड़ता है।

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; 
    } 

    } 
+0

लिंक 404 त्रुटि .. –

संबंधित मुद्दे