আমি অনেক উত্তর দেখতে পাচ্ছি, ওপির তিনটি প্রশ্নের উত্তরই দিচ্ছি না।
1) পারফরম্যান্সে একটি শব্দ: বাইট অ্যারেগুলি সম্ভবত অপ্রতুল, যদি না আপনি সঠিক পিক্সেল বাইট ক্রম ব্যবহার করতে পারেন যা আপনার ডিসপ্লে অ্যাডাপ্টারের বর্তমান রেজোলিউশন এবং রঙের গভীরতার সাথে মেলে।
সেরা অঙ্কন কর্মক্ষমতা অর্জন করতে, আপনার চিত্রটিকে কেবল একটি বুফেরডেমেজে রূপান্তর করুন যা আপনার বর্তমান গ্রাফিক্স কনফিগারেশনের সাথে সম্পর্কিত এক ধরণের মাধ্যমে উত্পন্ন হয়। এ createCompatibleImage দেখুন https://docs.oracle.com/javase/tutorial/2d/images/drawonimage.html
এই চিত্রগুলি কোনও প্রোগ্রামিংয়ের প্রচেষ্টা ছাড়াই কয়েকবার আঁকার পরে ডিসপ্লে কার্ডের মেমরিতে স্বয়ংক্রিয়ভাবে ক্যাশে হবে (জাভা 6 এর পরে এটি সুইংয়ের মধ্যে স্ট্যান্ডার্ড), এবং সেইজন্য আসল অঙ্কনটি সময় নগণ্য পরিমাণে নেবে - আপনি যদি চিত্রটি পরিবর্তন না করেন তবে ।
চিত্র পরিবর্তন করা মূল স্মৃতি এবং জিপিইউ মেমরির মধ্যে একটি অতিরিক্ত মেমরি স্থানান্তর নিয়ে আসবে - যা ধীর। বাফারডিম্যাজেজে চিত্রটিকে "পুনরায় আঁকুন" এড়িয়ে চলুন, গেটপিক্সেল এবং সেটপিক্সেলটি কোনও উপায়ে করা এড়িয়ে চলুন।
উদাহরণস্বরূপ, আপনি যদি কোনও গেমটি বিকাশ করছেন তবে সমস্ত গেমের অভিনেতাগুলিকে বুফেরডিমেজে এবং তারপরে কোনও জেপ্যানেলে আঁকানোর পরিবর্তে, সমস্ত অভিনেতাকে ছোট বাফার্ডআইমেজ হিসাবে লোড করা এবং আপনার জেপ্যানেল কোডটিতে একে একে একে আঁকতে খুব দ্রুত is তাদের যথাযথ অবস্থান - এইভাবে প্রধান মেমরি এবং জিপিইউ মেমরির মধ্যে ক্যাশিংয়ের জন্য চিত্রগুলির প্রাথমিক স্থানান্তর ব্যতীত কোনও অতিরিক্ত ডেটা স্থানান্তর নেই is
ইমেজআইকন হুডের নীচে একটি বাফারডিমেজ ব্যবহার করবে - তবে মূলত যথাযথ গ্রাফিক্স মোডের সাহায্যে একটি বাফারডিমেজ বরাদ্দ করা মূল বিষয়, এবং এই অধিকারটি করার কোনও প্রচেষ্টা নেই।
2) এটি করার স্বাভাবিক উপায়টি হল জেপ্যানেলের একটি ওভাররাইড পেইন্ট কম্পোনেন্ট পদ্ধতিতে একটি বাফার্ডআইমেজ আঁকুন। যদিও জাভা জিপিইউ মেমরিতে ক্যাশড ভোল্টাইলআইমেজেস নিয়ন্ত্রণকারী বাফার চেইনের মতো অতিরিক্ত পরিমাণে গুডিকে সমর্থন করে, তবে জাভা 6 এর পরে এগুলির কোনও ব্যবহার করার দরকার নেই যা জিপিইউ ত্বরণের এই সমস্ত বিবরণ প্রকাশ না করে যুক্তিসঙ্গত ভাল কাজ করে।
দ্রষ্টব্য যে জিপিইউ ত্বরণ কিছু নির্দিষ্ট ক্রিয়াকলাপের জন্য কাজ করতে পারে না, যেমন প্রসারিত চিত্রগুলি প্রসারিত করা।
3) যোগ করবেন না। কেবল উপরে বর্ণিত হিসাবে এটি আঁকা:
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, this);
}
চিত্রটি বিন্যাসের অংশ হলে "যুক্ত করা" অর্থবোধ করে। আপনার যদি জ্যাপানেলটি পূরণ করে একটি পটভূমি বা সম্মুখভূমি চিত্র হিসাবে এটি প্রয়োজন হয় তবে কেবল চিত্রকোম্পোন্ট এ আঁকুন। এবং তারপর যুক্ত করুন - আপনি একটি জেনেরিক সুইং উপাদান আপনার ইমেজ দেখাতে পারেন যে বানানোর পছন্দ করেন, তাহলে এটি একই গল্প (যদি আপনি JComponent ব্যবহার করতে পারেন এবং তার paintComponent পদ্ধতি ওভাররাইড) হল এই GUI উপাদান আপনার লেআউটে।
4) অ্যারেকে কিভাবে একটি বুফেরিডেমে রূপান্তর করা যায়
আপনার বাইট অ্যারেগুলিকে পিএনজিতে রূপান্তর করা, তারপরে এটি লোড করা যথেষ্ট সংস্থান নিবিড়। আরও ভাল উপায় হ'ল আপনার বিদ্যমান বাইট অ্যারেটিকে একটি বুফারডেমেজে রূপান্তর করা।
তার জন্য: লুপগুলি এবং অনুলিপি পিক্সেলের জন্য ব্যবহার করবেন না । এটা খুব ধীর। পরিবর্তে:
- বাফার্ডআইমেজের পছন্দসই বাইট স্ট্রাকচারটি শিখুন (আজকাল এটি আরজিবি বা আরজিবিএ, যা পিক্সেল প্রতি 4 বাইট হয় ধরে নেওয়া নিরাপদ)
- স্ক্যানলাইন শিখুন এবং স্ক্যানাইজ ব্যবহার করুন (যেমন আপনার 142 পিক্সেল প্রশস্ত চিত্র থাকতে পারে - তবে বাস্তব জীবনে এটি 256 পিক্সেল প্রশস্ত বাইট অ্যারে হিসাবে সংরক্ষণ করা হবে যেহেতু এটি প্রসেস করা আরও দ্রুত এবং জিপিইউ হার্ডওয়্যার দ্বারা অব্যবহৃত পিক্সগুলি মাস্ক করুন) )
- তারপরে একবারে এই নীতিগুলি অনুসারে আপনার অ্যারে তৈরি হয়ে গেলে, বাফার্ডআইমেজের সেটআরজিবি অ্যারে পদ্ধতিটি আপনার অ্যারে বাফার্ডআইমেজে অনুলিপি করতে পারে।
MemoryImageSource
এগুলিকে জেপিজি বা পিএনজি ফর্ম্যাটে রূপান্তর করা এবং তারপরেImageIO
সর্বাধিক উত্তরের পরামর্শ অনুসারে পড়ার চেয়ে কোনওটি ব্যবহার করা আরও দক্ষ । আপনি ব্যবহার করে আপনার চিত্রের ডেটা দিয়ে তৈরি একটিImage
থেকে পেতে পারেন এবং উত্তরগুলির মধ্যে একটি হিসাবে প্রস্তাবিত হিসাবে প্রদর্শন করুন।MemoryImageSource
createImage