2010-01-11 13 views
13

में आकार की छवियों की गुणवत्ता मैं drawBitmap() विधि का उपयोग कर छवियां दिखाना चाहता हूं। लेकिन इससे पहले कि मैं स्क्रीन आयामों के अनुसार इसे आकार बदलना चाहता हूं। मुझे परिणाम छवि की गुणवत्ता के साथ एक समस्या है। आप नीचे स्क्रीनशॉट और टेस्ट कोड देख सकते हैं। मैं अच्छी गुणवत्ता के साथ रनटाइम में छवियों का आकार कैसे बदल सकता हूं?एंड्रॉइड: रनटाइम

समाधान के लिए धन्यवाद।

मूल छवि: डिवाइस पर alt text http://dl.dropbox.com/u/709109/gradient.png

परिणाम स्क्रीनशॉट: alt text http://dl.dropbox.com/u/709109/device.png

import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Rect; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.LinearLayout; 

import java.io.IOException; 
import java.io.InputStream; 

public class MyActivity extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     LinearLayout container = (LinearLayout) findViewById(R.id.container); 
     container.addView(new View(this) { 
      @Override 
      protected void onDraw(Canvas canvas) { 
       Bitmap unscaledBitmap; 
       try { 
        InputStream in = getAssets().open("images/gradient.png"); 
        unscaledBitmap = BitmapFactory.decodeStream(in); 
        in.close(); 
        canvas.drawBitmap(unscaledBitmap, null, new Rect(0, 0, 320, 480), null); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 
} 

उत्तर

10

कृपया नीचे Romain's answer देखें।

मैं इस उत्तर को हटाना चाहता हूं, लेकिन मैं इसे स्वीकार करने के बाद से असमर्थ हूं क्योंकि इसे स्वीकार किया गया है।


ध्यान दें कि एंड्रॉयड [जब इस उत्तर मूल रूप से लिखा गया था, स्पष्ट रूप से 32-बिट रंग का अनुरोध नहीं करता] केवल 16-बिट रंग करना होगा, इसलिए जब आप अवांछित कलाकृतियों मिल कई बार हो सकता है।

आप एंड्रॉइड को स्वचालित रूप से डालने के विकल्प देने का विकल्प भी उपयोग करने का प्रयास कर सकते हैं, जबकि सही नहीं है, चीजों को थोड़ा बेहतर बनाने में मदद कर सकते हैं।

+1

धन्यवाद, यह सहायक उत्तर है! लेकिन मुझे वोट देने की कोई प्रतिष्ठा नहीं है। – shinydev

+0

अब मैं अपने ग्राफिक को तैयार करने के लिए "565 या तो फ़ोटोशॉप प्लगइन" का उपयोग कर रहा हूं। क्योंकि डाइटिंग उच्च लागत वाला ऑपरेशन है और यह डीकोडस्ट्रीम और ड्रॉ बिटमैप विधियों के साथ काम नहीं करता है। – shinydev

+1

एंड्रॉइड बस 32 बिट्स ठीक कर सकता है। बस सुनिश्चित करें कि आपकी बिटमैप और आपकी विंडो दोनों ARGB8888 प्रारूप का उपयोग करें। –

2

चेक बाहर http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html ((में) के साथ unscaledBitmap = BitmapFactory.decodeStream इस्तेमाल किया जा करने के लिए;

आप छवि में गुणवत्ता सेटिंग्स जोड़ सकते हैं। मुझे लगता है कि गुणवत्ता को कम किया जा रहा है क्योंकि आप पास नहीं कर रहे हैं वाई सेटिंग्स कैसे छवि को संसाधित किया जाना चाहिए।

+0

'बिटमैप फैक्ट्री.ऑप्शन 'में" गुणवत्ता सेटिंग्स "क्या हैं? मैं कोई नहीं देख सकता, और दस्तावेज़ "गुणवत्ता" दस्तावेज में एक बार प्रकट नहीं होता है। –

+0

http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inPreferQualityOverSpeed ​​है, लेकिन दस्तावेज़ कहते हैं कि यह केवल जेपीईजी डीकोड को संदर्भित करता है और आपकी फ़ाइल पीएनजी है। –

-1

इसके अलावा, यदि आपका आकार बदलने वाला फ़ंक्शन छवि के पहलू अनुपात का सम्मान नहीं करता है, तो गुणवत्ता प्रभावित हो जाती है। आप वेब पर कुछ आकार बदलने वाले एल्गोरिदम पा सकते हैं, उदाहरण के लिए check this out

+0

नहीं, दोनों छवियों का एक ही अनुपात है। मूल छवि: 600x900 अनुपात 1.5 नई छवि का आकार: 320x480 अनुपात 1.5 – shinydev

+0

आपके द्वारा प्रदान किए गए लिंक पर कोई भी आकार बदलने वाला एल्गोरिदम नहीं मिला। सही पैमाने मूल्य गणना के बारे में सिर्फ चर्चा ... – goRGon

15

ड्राइंग समय (जो कि बहुत महंगा होने वाला है) में आकार बदलने के बजाय, ऑफस्क्रीन बिटमैप में आकार बदलने का प्रयास करें और सुनिश्चित करें कि बिटमैप 32 बिट्स (ARGB888) है।

+0

जैसा कि मैंने सोचा था, एंड्रॉइड *** बिटमैपफ़ैक्टरी.ऑप्शन :: इन नमूना आकार-> बिटमैपफैक्टरी.decodeResource() ** का उपयोग करते समय केवल अच्छा डाउनस्कलिंग एल्गोरिदम (निकटतम पड़ोसी नहीं) लागू कर रहा है। * लेकिन यह मूल की तुलना में केवल पूर्ण पूर्णांक समय में ही डाउनस्केल करने की अनुमति देता है। एंड्रॉइड में एक सटीक रिज़ॉल्यूशन के लिए डाउनस्केल करने का कोई तरीका है कि मुझे निकटतम पड़ोसी एल्गोरिदम से बेहतर कुछ उपयोग करने की आवश्यकता है (जिसे हर बार जब मैं createScaledBitmap(), createBitmap + matrix और e.t.c. कॉल करता हूं) का उपयोग किया जाता है? – goRGon

1

पुराने प्लेटफार्मों पर createScaledBitmap (..) विधि के क्रियान्वयन (एपीआई स्तर < 12) कारण समस्याओं जब आप एक ARGB_8888 पैमाने पर करने की कोशिश बिटमैप जिसमें वास्तविक अल्फा मान नहीं है (यानी प्रत्येक पिक्सेल में अल्फा = 255 है), क्योंकि उनके पास एल्फा ध्वज गलत पर सेट है। उस स्थिति में स्केल किए गए बिटमैप को स्वचालित रूप से RGB_565 प्रारूप में परिवर्तित कर दिया जाता है।

इसलिए एपीआई स्तर 12 के बाद से वहाँ एक तरीका है (कक्षा बिटमैप में)

setHasAlpha(boolean value); 

कौन सा जब createScaledBitmap (..) का उपयोग करके रूपांतरण रोकने में मदद करता है।

एपीआई स्तर> 3 पर एक ही विधि का उपयोग करने का एक तरीका है। यह बहुत लंबे समय से मौजूद है, बस छिपा हुआ है।स्रोत कोड सहित सभी आवश्यक कदम का वर्णन यहां:

https://stackoverflow.com/a/12202069/1082933

आशा इस मदद करता है।

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