Android
पोर्टरडफ मोड
खोज…
परिचय
पोर्टरडफ को छवियों के संयोजन के एक तरीके के रूप में वर्णित किया जाता है जैसे कि वे "कार्डबोर्ड के अनियमित आकार के टुकड़े" थे, एक दूसरे पर ओवरले, साथ ही साथ अतिव्यापी भागों को सम्मिश्रित करने की एक योजना।
टिप्पणियों
"पोर्टर डफ" अपने आप में एक अल्फा कंपोजिंग तकनीक है, जिसे थॉमस पोर्टर और टॉम डफ द्वारा एक पेपर के नाम पर रखा गया है ।
संक्षेप में, तकनीक दो छवियों को अल्फा चैनल के साथ ले जाती है और दो छवियों के पिक्सेल मूल्यों को जोड़कर आउटपुट छवि उत्पन्न करती है। विभिन्न संयोजन मोड अलग आउटपुट छवि में परिणाम करते हैं। उदाहरण के लिए, निम्न छवि में, नीली आकृति (स्रोत, मौजूदा पिक्सेल) को अलग-अलग मोड में यलो आकार (गंतव्य, नया पिक्सेल) के साथ जोड़ा जाता है:
एक पोर्टरडफ कलरफिल्टर बनाना
PorterDuff.Mode
एक बनाने के लिए प्रयोग किया जाता है PorterDuffColorFilter
। एक रंग फिल्टर एक दृश्य संसाधन के प्रत्येक पिक्सेल के रंग को संशोधित करता है।
ColorFilter filter = new PorterDuffColorFilter(Color.BLUE, PorterDuff.Mode.SRC_IN);
उपरोक्त फ़िल्टर गैर-पारदर्शी पिक्सेल को नीले रंग में रंग देगा।
रंग फिल्टर को एक Drawable
लागू किया जा सकता है:
drawable.setColorFilter(filter);
यह एक ImageView
लिए लागू किया जा सकता है:
imageView.setColorFilter(filter);
इसके अलावा, यह एक Paint
लागू किया जा सकता है, ताकि उस पेंट का उपयोग करके जो रंग तैयार हो, उसे फ़िल्टर द्वारा संशोधित किया जाए:
paint.setColorFilter(filter);
एक पोर्टरडफ XferMode बनाना
एक Xfermode
(लगता है "स्थानांतरण" मोड) ड्राइंग पाइपलाइन में एक हस्तांतरण कदम के रूप में काम करता है। जब एक Xfermode
Paint
लागू होता है, तो पेंट के साथ खींचे गए पिक्सल को मोड के अनुसार अंतर्निहित पिक्सल (पहले से ही खींचा हुआ) के साथ जोड़ा जाता है:
paint.setColor(Color.BLUE);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
अब हमारे पास एक ब्लू टिंट पेंट है। आरेखित कोई भी आकृति के क्षेत्र में पहले से मौजूद, गैर-पारदर्शी पिक्सेल नीले रंग का हो जाएगा।
PorterDuffXfermode का उपयोग कर एक बिटमैप पर एक रेडियल मास्क (विगनेट) लागू करें
/**
* Apply a radial mask (vignette, i.e. fading to black at the borders) to a bitmap
* @param imageToApplyMaskTo Bitmap to modify
*/
public static void radialMask(final Bitmap imageToApplyMaskTo) {
Canvas canvas = new Canvas(imageToApplyMaskTo);
final float centerX = imageToApplyMaskTo.getWidth() * 0.5f;
final float centerY = imageToApplyMaskTo.getHeight() * 0.5f;
final float radius = imageToApplyMaskTo.getHeight() * 0.7f;
RadialGradient gradient = new RadialGradient(centerX, centerY, radius,
0x00000000, 0xFF000000, android.graphics.Shader.TileMode.CLAMP);
Paint p = new Paint();
p.setShader(gradient);
p.setColor(0xFF000000);
p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
canvas.drawRect(0, 0, imageToApplyMaskTo.getWidth(), imageToApplyMaskTo.getHeight(), p);
}