আমার পিএনজি, জেপিইজি এবং জিআইএফ ফাইলগুলির আকার পরিবর্তন করতে হবে। আমি জাভা ব্যবহার করে এটি কীভাবে করতে পারি?
আমার পিএনজি, জেপিইজি এবং জিআইএফ ফাইলগুলির আকার পরিবর্তন করতে হবে। আমি জাভা ব্যবহার করে এটি কীভাবে করতে পারি?
উত্তর:
চিত্রটি লোড করার পরে আপনি চেষ্টা করতে পারেন:
BufferedImage createResizedCopy(Image originalImage,
int scaledWidth, int scaledHeight,
boolean preserveAlpha)
{
System.out.println("resizing...");
int imageType = preserveAlpha ? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB;
BufferedImage scaledBI = new BufferedImage(scaledWidth, scaledHeight, imageType);
Graphics2D g = scaledBI.createGraphics();
if (preserveAlpha) {
g.setComposite(AlphaComposite.Src);
}
g.drawImage(originalImage, 0, 0, scaledWidth, scaledHeight, null);
g.dispose();
return scaledBI;
}
এফডাব্লুআইডাব্লু আমি সবে মুক্তি পেয়েছি (অ্যাপাচি 2, গিটহাবটিতে হোস্ট করা হয়েছে) জাভা জন্য ইম্পস্কালার নামে একটি সাধারণ চিত্র-স্কেলিং লাইব্রেরি ( মাভেন কেন্দ্রীয়তে উপলব্ধ )।
ইমেজ-স্কেলিংয়ের জন্য গ্রন্থাগারটি কয়েকটি পৃথক পদ্ধতি প্রয়োগ করে (ক্রিস ক্যাম্পবেলের কিছু ছোটখাট বর্ধনের সাথে বর্ধিত পদ্ধতি সহ) এবং যদি আপনি এটি জিজ্ঞাসা করেন তবে আপনার পক্ষে সর্বাধিক অনুকূল পিকচারটি বেছে নেবে, বা আপনাকে দ্রুততম বা সেরা দেখাচ্ছে (যদি আপনি যে জন্য জিজ্ঞাসা করুন)।
ব্যবহার মৃত-সহজ, স্থির পদ্ধতিগুলির একগুচ্ছ। সবচেয়ে সহজ ব্যবহারের ক্ষেত্রে:
BufferedImage scaledImage = Scalr.resize(myImage, 200);
সমস্ত ক্রিয়াকলাপ চিত্রের মূল অনুপাত বজায় রাখে, সুতরাং এক্ষেত্রে আপনি imgscalr কে 200 পিক্সেল প্রশস্ত এবং 200 পিক্সেল লম্বার সীমার মধ্যে আপনার চিত্রটিকে পুনরায় আকার দিতে বলছেন এবং এটি ডিফল্টরূপে এটির জন্য সেরা চেহারা এবং দ্রুততম পদ্ধতির স্বয়ংক্রিয়ভাবে নির্বাচন করবে নির্দিষ্ট করা হয়নি।
আমি শুরুতেই বুঝতে পারি যে এটি আত্ম-প্রচারের মতো দেখাচ্ছে (এটি হ'ল) তবে আমি এই সঠিক বিষয়টিকে গুগল করতে আমার ন্যায্য অংশ ব্যয় করেছি এবং বিভিন্ন ফলাফল / দৃষ্টিভঙ্গি / চিন্তাভাবনা / পরামর্শ নিয়ে এসেছি এবং বসে বসে একটি লিখার সিদ্ধান্ত নিয়েছি সরল বাস্তবায়ন যা 80-85% ব্যবহারের ক্ষেত্রে মোকাবেলা করবে যেখানে আপনার একটি চিত্র রয়েছে এবং সম্ভবত এটির জন্য একটি থাম্বনেইল চান - যত তাড়াতাড়ি সম্ভব ততই ভাল দেখানো (যত চেষ্টা করেছেন তাদের জন্য, আপনি লক্ষ্য করবেন) একটি গ্রাফিক্স.ড্রাইজ ইমেজ করা এমনকি ছোট্ট যথেষ্ট পরিমাণ ইমেজটিতে বিকিউবিক ইন্টারপোলেশন সহ, এটি এখনও আবর্জনার মতো দেখাচ্ছে)।
new ImageScaler(img).resizeTo(...).rotate(...).cropTo(...).toOutputBuffer()
। আমি আপনার উপায়ও পছন্দ করি এবং আমি এটি সহজ বলে মনে করি।
থাম্বনেইলেটর এমআইটি লাইসেন্সের অধীনে বিতরণ করা একটি সাবলীল ইন্টারফেস সহ জাভা-র জন্য একটি ওপেন-সোর্স ইমেজ রাইজিং লাইব্রেরি ।
আমি এই লাইব্রেরিটি লিখেছি কারণ জাভাতে উচ্চমানের থাম্বনেইল তৈরি করা আশ্চর্যজনকভাবে কঠিন হতে পারে এবং ফলস্বরূপ কোডটি বেশ অগোছালো হতে পারে। থাম্বনেইলেটরের সাহায্যে একটি সহজ সাবলীল এপিআই ব্যবহার করে মোটামুটি জটিল কাজগুলি প্রকাশ করা সম্ভব।
একটি সহজ উদাহরণ
একটি সাধারণ উদাহরণের জন্য, একটি চিত্র নেওয়া এবং এটিকে আকারটি 100 x 100 (মূল চিত্রের দিক অনুপাত সংরক্ষণ করে) করা এবং কোনও ফাইলে সংরক্ষণ করা একক বিবৃতিতে অর্জন করতে পারে:
Thumbnails.of("path/to/image")
.size(100, 100)
.toFile("path/to/thumbnail");
একটি উন্নত উদাহরণ
থাম্বনেইলেটরের সাবলীল ইন্টারফেসের মাধ্যমে জটিল পুনরায় আকার দেওয়ার কাজগুলি সম্পাদন সহজতর করা হয়।
ধরা যাক আমরা নিম্নলিখিতগুলি করতে চাই:
0.85
,thumbnail.
শুরুতে যোগ করাথাম্বনেইলেটরে অনুবাদিত, আমরা নিম্নলিখিতগুলির সাথে উপরের সম্পাদন করতে সক্ষম হব:
Thumbnails.of(new File("path/to/directory").listFiles())
.size(100, 100)
.outputFormat("JPEG")
.outputQuality(0.85)
.toFiles(Rename.PREFIX_DOT_THUMBNAIL);
চিত্রের গুণমান এবং গতি সম্পর্কে একটি নোট
গ্রহণযোগ্য রানটাইম পারফরম্যান্স নিশ্চিত করার সময় উচ্চ-মানের থাম্বনেইল উত্পন্ন করার জন্য এই লাইব্রেরিটি চিত হােস এবং রোমেন গাই দ্বারা ফিল্টি রিচ ক্লায়েন্টগুলিতে হাইলাইট করা প্রগতিশীল বিলিনিয়ার স্কেলিং পদ্ধতি ব্যবহার করে ।
এটি করার জন্য আপনার কোনও গ্রন্থাগার দরকার নেই। আপনি নিজে জাভা দিয়ে এটি করতে পারেন।
স্কেলিং ইমেজগুলি সম্পর্কে ক্রিস ক্যাম্পবেলের একটি দুর্দান্ত এবং বিস্তারিত লেখার ব্যবস্থা রয়েছে - এই নিবন্ধটি দেখুন ।
চেত হায়েস এবং রোমেন গাইয়ের তাদের ফিলিটি রিচ ক্লায়েন্টস বইটিতে চিত্র স্কেলিংয়ের একটি বিশদ এবং খুব তথ্যমূলক রচনা-আপ রয়েছে ।
জাভা অ্যাডভান্সড ইমেজিং এখন ওপেন সোর্স এবং আপনার প্রয়োজনীয় ক্রিয়াকলাপ সরবরাহ করে।
আপনি যদি বড় ইমেজ নিয়ে কাজ করছেন বা একটি সুন্দর চেহারা ফলাফল চান এটি জাভাতে তুচ্ছ কাজ নয়। কেবলমাত্র গ্রাফিক্স 2 ডি এর মাধ্যমে পুনরুদ্ধার অপের মাধ্যমে এটি করা একটি উচ্চ মানের থাম্বনেইল তৈরি করবে না। আপনি এটি জেএআই ব্যবহার করে করতে পারেন, তবে এটির জন্য আপনার আরও ভাল কাজ দরকার যা আপনি কল্পনা করে দেখেন যা দেখতে ভাল লাগে এবং জেআইএর আমাদের জেভিএমকে আউটআফমেমরি ত্রুটিগুলি দিয়ে ফুঁকিয়ে দেওয়ার অভ্যাসের অভ্যাস রয়েছে।
আমি ইমেজম্যাগিককে বাহ্যিক এক্সিকিউটেবল হিসাবে ব্যবহার করার পরামর্শ দিচ্ছি যদি আপনি এটি থেকে দূরে সরে যেতে পারেন। এটি ব্যবহার করা সহজ এবং এটি কাজটি ঠিকমতো করে যাতে আপনার প্রয়োজন না হয়।
জাভা এপিআই ইমেজ এবং ডাউনগ্রেড ইমেজ মানের জন্য একটি মানক স্কেলিং বৈশিষ্ট্য সরবরাহ করে না।
এর কারণে আমি জাভাসিভি থেকে সিভিআরসিজেড ব্যবহার করার চেষ্টা করেছি তবে মনে হচ্ছে এটি সমস্যা সৃষ্টি করে।
আমি চিত্র স্কেলিংয়ের জন্য একটি ভাল গ্রন্থাগার পেয়েছি: কেবল আপনার pom.xML এ "জাভা-চিত্র-স্কেলিং" এর জন্য নির্ভরতা যুক্ত করুন।
<dependency>
<groupId>com.mortennobel</groupId>
<artifactId>java-image-scaling</artifactId>
<version>0.8.6</version>
</dependency>
মাভেন ভান্ডারগুলিতে আপনি এর জন্য সাম্প্রতিক সংস্করণটি পাবেন।
যাত্রা। আপনার জাভা প্রোগ্রামে
ResampleOp resamOp = new ResampleOp(50, 40);
BufferedImage modifiedImage = resamOp.filter(originalBufferedImage, null);
আপনি জাভা জন্য কম্যান্ড-লাইন ইন্টারফেস হিসাবে im4java সহ গ্রাফিক্স ম্যাগিক ইমেজ প্রসেসিং সিস্টেমটি ব্যবহার করার চেষ্টা করতে পারেন ।
গ্রাফিক্স ম্যাগিকের অনেক সুবিধা রয়েছে তবে সবার জন্য একটি:
চিত্র ম্যাজিক উল্লেখ করা হয়েছে। জে ম্যাগিক নামে একটি জেএনআই ফ্রন্ট এন্ড প্রকল্প রয়েছে। এটি কোনও বিশেষ স্থিতিশীল প্রকল্প নয় (এবং চিত্র ম্যাগিক নিজেই অনেকগুলি পরিবর্তন করতে এবং এমনকি সামঞ্জস্যতা ভঙ্গ করতেও পরিচিত)। এটি বলেছিল, উচ্চতর আউটপুট, স্বল্প বিলম্বিত হারে স্কেলিং সম্পাদনের জন্য উত্পাদন পরিবেশে জেমাগিক এবং ইমেজ ম্যাজিকের একটি সামঞ্জস্যপূর্ণ সংস্করণ ব্যবহার করে আমাদের ভাল অভিজ্ঞতা হয়েছে। আমরা আগে যা চেষ্টা করেছি এমন সমস্ত জাভা গ্রাফিক্স লাইব্রেরির সাথে গতি তখন যথেষ্ট উন্নত ছিল।
কেবল বুখার্ডের উত্তরটি ব্যবহার করুন তবে গ্রাফিকগুলি তৈরি করার পরে এই লাইনটি যুক্ত করুন:
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
আপনি BICUBIC এ মানও সেট করতে পারেন, এটি একটি উন্নত মানের চিত্র তৈরি করবে তবে এটি আরও ব্যয়বহুল অপারেশন। আপনি সেট করতে পারেন এমন অন্যান্য রেন্ডারিং ইঙ্গিত রয়েছে তবে আমি খুঁজে পেয়েছি যে ইন্টারপোলেশন সবচেয়ে উল্লেখযোগ্য প্রভাব তৈরি করে। আপনি যদি অনেকটা জুম করতে চান তবে মনে রাখবেন, জাভা কোড সম্ভবত খুব ধীর হবে। আমি দেখতে পাই যে বৃহত্তর চিত্রগুলি প্রায় 300% জুমের তুলনায় পিছনে উত্পাদন শুরু করে এমনকি গুণমানের ওপরে গতির জন্য অনুকূলিতকরণের জন্য সমস্ত রেন্ডারিং ইঙ্গিতগুলি সেট করে।
আপনি এই ধরণের অপারেশনের জন্য মার্ভিন (খাঁটি জাভা চিত্র প্রক্রিয়াকরণ কাঠামো) ব্যবহার করতে পারেন: http://marvinproject.sourceforge.net
স্কেল প্লাগ-ইন: http://marvinproject.sourceforge.net/en/plugins/scale.html
দেখা যাচ্ছে যে পারফরম্যান্ট স্কেলার লেখার বিষয়টি তুচ্ছ নয়। আমি ওপেন সোর্স প্রকল্পের জন্য এটি একবার করেছিলাম: ইমেজস্কেলার ।
নীতিগতভাবে 'java.awt. ইমেজ # getScaledInstance (int, int, int)' কাজটিও করবে, তবে এর সাথে একটি বাজে বাগ রয়েছে - বিশদর জন্য আমার লিঙ্কটি দেখুন।
আমি জিআইএফ অ্যানিমেশন পরিচালনা করার জন্য অবাধে উপলভ্য ক্লাসগুলির (অ্যানিমেটেড জিফইনকোডার, জিআইপিডেকোডার এবং এলডাব্লুডিজাউন কোডার) সাথে একটি সমাধান তৈরি করেছি।
আপনি jgifcode jar ডাউনলোড করতে এবং GifImageUtil ক্লাস চালাতে পারেন। লিঙ্ক: http://www.jgifcode.com
আপনি নিম্নলিখিত জনপ্রিয় পণ্য ব্যবহার করতে পারেন: থাম্বনেইলটার
আপনি যদি @ রিয়াদ কল্লার উত্তরটির মতো ইমপ্যাসক্লারটি আমদানি করতে না চান যা উপরে আমি পরীক্ষা করে দেখলাম যে এটি খুব ভাল কাজ করে, আপনি পিটার ওয়ালসারের উত্তর @ পিটার ওয়ালসের কাছ থেকে নেওয়া অন্য কোনও ইস্যুতে এটি করতে পারেন যদিও:
/**
* utility method to get an icon from the resources of this class
* @param name the name of the icon
* @return the icon, or null if the icon wasn't found.
*/
public Icon getIcon(String name) {
Icon icon = null;
URL url = null;
ImageIcon imgicon = null;
BufferedImage scaledImage = null;
try {
url = getClass().getResource(name);
icon = new ImageIcon(url);
if (icon == null) {
System.out.println("Couldn't find " + url);
}
BufferedImage bi = new BufferedImage(
icon.getIconWidth(),
icon.getIconHeight(),
BufferedImage.TYPE_INT_RGB);
Graphics g = bi.createGraphics();
// paint the Icon to the BufferedImage.
icon.paintIcon(null, g, 0,0);
g.dispose();
bi = resizeImage(bi,30,30);
scaledImage = bi;// or replace with this line Scalr.resize(bi, 30,30);
imgicon = new ImageIcon(scaledImage);
} catch (Exception e) {
System.out.println("Couldn't find " + getClass().getName() + "/" + name);
e.printStackTrace();
}
return imgicon;
}
public static BufferedImage resizeImage (BufferedImage image, int areaWidth, int areaHeight) {
float scaleX = (float) areaWidth / image.getWidth();
float scaleY = (float) areaHeight / image.getHeight();
float scale = Math.min(scaleX, scaleY);
int w = Math.round(image.getWidth() * scale);
int h = Math.round(image.getHeight() * scale);
int type = image.getTransparency() == Transparency.OPAQUE ? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB;
boolean scaleDown = scale < 1;
if (scaleDown) {
// multi-pass bilinear div 2
int currentW = image.getWidth();
int currentH = image.getHeight();
BufferedImage resized = image;
while (currentW > w || currentH > h) {
currentW = Math.max(w, currentW / 2);
currentH = Math.max(h, currentH / 2);
BufferedImage temp = new BufferedImage(currentW, currentH, type);
Graphics2D g2 = temp.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2.drawImage(resized, 0, 0, currentW, currentH, null);
g2.dispose();
resized = temp;
}
return resized;
} else {
Object hint = scale > 2 ? RenderingHints.VALUE_INTERPOLATION_BICUBIC : RenderingHints.VALUE_INTERPOLATION_BILINEAR;
BufferedImage resized = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = resized.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, hint);
g2.drawImage(image, 0, 0, w, h, null);
g2.dispose();
return resized;
}
}
এই ফলিং পদ্ধতিটি ব্যবহার করে দেখুন:
ImageIcon icon = new ImageIcon("image.png");
Image img = icon.getImage();
Image newImg = img.getScaledInstance(350, 350, java.evt.Image.SCALE_SMOOTH);
icon = new ImageIcon(img);
JOptionPane.showMessageDialog(null, "image on The frame", "Display Image", JOptionPane.INFORMATION_MESSAGE, icon);