देता है मैं एक एंड्रॉइड ऐप पर काम कर रहा हूं जो फ़्लिकर से डाउनलोड की गई तस्वीरों को प्रदर्शित करता है। मैं एक बाइट सरणी, जो बारी में प्रासंगिक फ़्लिकर URL से पढ़ा जाता है से एक बिटमैप वस्तु प्राप्त, इस प्रकार है:एंड्रॉइड: बिटमैपफैक्टरी.decodeByteArray पिक्सलेटेड बिटमैप
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inDither = true;
opt.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length, opt);
मैं तो एक दृश्य वस्तु की OnDraw विधि में एक कैनवास पर बिटमैप आकर्षित:
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
canvas.drawBitmap(bitmap, 0, 0, paint);
समस्या यह है कि परिणामी तस्वीर पिक्सलेट की गई है और मैं यह नहीं समझ सकता कि क्यों; मैंने भाग्य के साथ ऑप्ट और पेंट ऑब्जेक्ट्स की कई भिन्नताओं की कोशिश की है।
Bad image, see pixelation in top left corner http://homepages.inf.ed.ac.uk/s0677975/bad.jpg
Good picture, this is the expected result http://homepages.inf.ed.ac.uk/s0677975/good.jpg
देखो उदहारण के लिए: चित्र मेरे एप्लिकेशन में दिखाया गया है और मूल URL पर चित्र के बीच का अंतर लगभग पालन करके प्रदर्शित किया गया है अंतर देखने के लिए ऊपरी-बाएं कोने में बादलों पर।
ध्यान दें कि जेपीईजी चित्र जो परियोजना संसाधनों से लोड होते हैं और इसी तरह से प्रदर्शित होते हैं, ठीक है, यानी कोई पिक्सेलेशन नहीं है।
क्या कोई मुझे यह संकेत दे सकता है कि यह क्यों हो रहा है?
थोड़ा विस्तार करने के लिए, बाइट सरणी फ़्लिकर से निम्नानुसार प्राप्त की जाती है; इस रोमेन लड़का द्वारा फ़ोटोस्ट्रीम app से कोड पर आधारित है:
InputStream in = new BufferedInputStream(url.openStream(), IO_BUFFER_SIZE);
final ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
out = new BufferedOutputStream(dataStream, IO_BUFFER_SIZE);
copy(in, out);
out.flush();
final byte[] data = dataStream.toByteArray();
पुनश्च: मैं भी android.developer गूगल समूह पर इस सवाल का एक संस्करण था।
आपके सुझाव के लिए बहुत बहुत धन्यवाद - अब मैं वास्तव में परेशान हूं! जैसा आपने सुझाव दिया और पाया कि डाउनलोड बाइट सरणी से सीधे उत्पन्न छवि वास्तव में पिक्सलेटेड है। हालांकि, यह वही यूआरएल से डाउनलोड किया जाता है, जब मेरे कंप्यूटर पर एक्सेस किया जाता है, तो पिक्सलेट नहीं किया जाता है।
http://farm3.static.flickr.com/2678/4315351421_54e8cdb8e5.jpg
भी अजनबी, जब मैं सिम्युलेटर में के बजाय मेरे फोन (एक एचटीसी हीरो) पर एक ही अनुप्रयोग चलाने, वहाँ कोई पिक्सेलेशन है: यहाँ इसी फ़्लिकर यूआरएल है।
पृथ्वी पर यह कैसे संभव है?
नीचे कोड मैं किसी URL से एक बिटमैप लोड करने के लिए इस्तेमाल करते हैं - यह रोमेन लड़का द्वारा फ़ोटोस्ट्रीम एप्लिकेशन पर आधारित है, और यह विल के सुझाव कच्चे बाइट सरणी लिखने के लिए शामिल किया गया है दायर करने के लिए:
Bitmap loadPhotoBitmap(URL url) {
Bitmap bitmap = null;
InputStream in = null;
BufferedOutputStream out = null;
try {
FileOutputStream fos = new FileOutputStream("/sdcard/photo-tmp.jpg");
BufferedOutputStream bfs = new BufferedOutputStream(fos);
in = new BufferedInputStream(url.openStream(),
IO_BUFFER_SIZE);
final ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
out = new BufferedOutputStream(dataStream, IO_BUFFER_SIZE);
copy(in, out);
out.flush();
final byte[] data = dataStream.toByteArray();
bfs.write(data, 0, data.length);
bfs.flush();
BitmapFactory.Options opt = new BitmapFactory.Options();
bitmap = BitmapFactory.decodeByteArray(data, 0, data.length, opt);
} catch (IOException e) {
android.util.Log.e(LOG_TAG, "Could not load photo: " + this, e);
} finally {
closeStream(in);
closeStream(out)
closeStream(bfs);
}
return bitmap;
}
private static void copy(InputStream in, OutputStream out) throws IOException {
byte[] b = new byte[IO_BUFFER_SIZE];
int read;
while ((read = in.read(b)) != -1) {
out.write(b, 0, read);
}
}
private static void closeStream(Closeable stream) {
if (stream != null) {
try {
stream.close();
} catch (IOException e) {
android.util.Log.e(LOG_TAG, "Could not close stream", e);
}
}
}
क्या मैं यहाँ पागल हो रहा हूँ? बेस्ट, माइकल।
मैंने छवियों को रेखांकित करने की स्वतंत्रता ली, क्योंकि आम तौर पर प्रश्न को अच्छे और पढ़ने में आसान बनाता है। – unwind
क्या आपको कभी इसके लिए कोई समाधान मिला है? मैंने सुझावों का प्रयास किया है, लेकिन कोई भाग्य नहीं है। यह बहुत परेशान है। एक फुटनोट के रूप में – blork
, यह न भूलें कि जेपीईजी एंड्रॉइड पर्यावरण में लापरवाह नहीं है। हालांकि यह समर्थित है, यह पीएनजी के पक्ष में निराश है। – user836725