দুটি চিত্র মার্জ করা হচ্ছে


84

আমাকে জাভাতে দুটি চিত্র (বাফার্ডআইমেজ) মার্জ করতে হবে। স্বচ্ছতা না থাকলে সমস্যা হবে না। বেস ইমেজ ইতিমধ্যে কিছু স্বচ্ছতা আছে। আমি এটি এটির মতোই রাখতে চাই এবং এটিতে একটি "মাস্ক" প্রয়োগ করতে চাই, দ্বিতীয় চিত্র। এই দ্বিতীয় চিত্রটির কোনও অস্বচ্ছ পিক্সেল নেই, আসলে এটি প্রায় সম্পূর্ণ স্বচ্ছ, কিছুটা স্বচ্ছ পিক্সেল রয়েছে কিছুটা "হালকা প্রভাব" দিতে যেমন একটি রেফ্লেক্সের মতো। গুরুত্বপূর্ণ বিশদ: গ্রাফিক্স সহ আমি পর্দায় এটি করতে চাই না, ফলস্বরূপ সংযুক্তির সাথে আমার একটি বাফারডিমেজ পাওয়া উচিত।

আমাকে কি কেউ সাহায্য করতে পারবেন? ধন্যবাদ!

বিশদ বিবরণ: স্বচ্ছতা বজায় রেখে দুটি চিত্র মার্জ করুন। এটিই আমার করা দরকার।

দ্রষ্টব্য: জাভাতে এই সেট বাফার্ডআইমেজ আলফা মাস্কটি আমার যা প্রয়োজন তা তা করে না কারণ এটি দুটি চিত্রের স্বচ্ছতার সাথে ভালভাবে পরিচালনা করে না - এটি প্রথম চিত্রের স্বচ্ছতা পরিবর্তন করে।

উত্তর:


181

স্বচ্ছতার সাথে কেবল একটি নতুন বাফারডিমাইজ তৈরি করুন, তারপরে এটিতে অন্য দুটি চিত্র আঁকুন (পূর্ণ বা অর্ধ-স্বচ্ছতার সাথে)। এটি দেখতে এটির মতো হবে:

চিত্র প্লাস ওভারলে

নমুনা কোড (চিত্রগুলিকে 'image.png' এবং 'ওভারলে.পিং' বলা হয়):

File path = ... // base path of the images

// load source images
BufferedImage image = ImageIO.read(new File(path, "image.png"));
BufferedImage overlay = ImageIO.read(new File(path, "overlay.png"));

// create the new image, canvas size is the max. of both image sizes
int w = Math.max(image.getWidth(), overlay.getWidth());
int h = Math.max(image.getHeight(), overlay.getHeight());
BufferedImage combined = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);

// paint both images, preserving the alpha channels
Graphics g = combined.getGraphics();
g.drawImage(image, 0, 0, null);
g.drawImage(overlay, 0, 0, null);

g.dispose();

// Save as new image
ImageIO.write(combined, "PNG", new File(path, "combined.png"));

প্রথমটির কেন্দ্রে দ্বিতীয় চিত্র রাখার উপায় আছে?
আহমেদ

6
আপনি g.dispose () আবেদন করা উচিত নয়; শেষে?
এম-সজলিক

হাই, আমি এই পদ্ধতির অনুসরণ করেছি এবং কেবলমাত্র দ্বিতীয় চিত্রটি সংরক্ষণ করেছি তবে প্রথম চিত্র নয় ... এখানে কোনও সহায়তার প্রশংসা করা হবে ..
টিপি_জেএভিএ

@ পিটার আমি যখন জাইপেইগ ফাইল হিসাবে সম্মিলিত ফাইলটি ডান করি তখন চিত্রটি ধূসর হয়। দয়া করে সহায়তা করুন
মোহাম্মদ শেবিন

3

আমি আপনাকে একটি নির্দিষ্ট উত্তর দিতে পারব না, তবে জাভা.ওয়ট.এল্ফা কমপোজিটটি এখানে আপনার বন্ধু। আপনি কীভাবে দুটি চিত্র একত্রিত করতে চান তার উপর আপনি নিখুঁত নিয়ন্ত্রণ পাবেন। তবে এটি ব্যবহার করা সোজা নয় - আপনাকে প্রথমে গ্রাফিক্স তত্ত্বের কিছুটা শিখতে হবে।


3

আপনি যে প্রভাবটি অর্জনের চেষ্টা করছেন সে সম্পর্কে আরও অজানা ছাড়া আমি কেবল উল্লেখ করব যে আপনি ঠিক একটি বাফারডিম্যাজেও আঁকতে পারেন। সুতরাং আপনি স্ক্রিনে যা কিছু করতে পারেন তা ঠিক ইমেজটিতেই করতে পারেন।

সুতরাং আপনি যদি চান সমস্ত কিছু অন্যের উপরে আঁকা হয় তবে এটি সত্যই সহজ। বেস ইমেজের জন্য গ্রাফিক্স অবজেক্টটি কেবল ধরুন এবং এটির উপরে অন্যটি আঁকুন।

আবার, আপনি যে সঠিক প্রভাবের জন্য যাচ্ছেন তার উপর নির্ভর করে কাজ নাও করতে পারে। আরও বিশদ আরও ভাল সাহায্য করতে পারে। উদাহরণস্বরূপ, অন্যান্য উত্তরদাতা যেমন উল্লেখ করেছেন বা কাস্টম ইমেজওপ (বা বিদ্যমান চিত্র-আপসের কিছু সংমিশ্রণ) হিসাবে এটি আলফা কম্পোজিটের জন্য কাজ job


1

যে কোনও ধরনের ফাইলকে উল্লম্বভাবে মার্জ করুন।

void mergeFiles(List<String> files, String fileName) {
        int heightTotal = 0;
        int maxWidth = 100;

        List<BufferedImage> images = new ArrayList<>();
        try {
            for (String file : files) {
                BufferedImage image = ImageIO.read(new File(file));
                images.add(image);
            }


        for (BufferedImage bufferedImage : images) {
            heightTotal += bufferedImage.getHeight();
            if (bufferedImage.getWidth() > maxWidth) {
                maxWidth = bufferedImage.getWidth();
            }
        }


        int heightCurr = 0;
        BufferedImage concatImage = new BufferedImage(maxWidth, heightTotal, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2d = concatImage.createGraphics();
        for (BufferedImage bufferedImage : images) {
            g2d.drawImage(bufferedImage, 0, heightCurr, null);
            heightCurr += bufferedImage.getHeight();
        }

        File compressedImageFile = new File(fileName);
        OutputStream outputStream = new FileOutputStream(compressedImageFile);

        float imageQuality = 0.7f;
        Iterator<ImageWriter> imageWriters = ImageIO.getImageWritersByFormatName("jpeg");

        if (!imageWriters.hasNext())
            throw new IllegalStateException("Writers Not Found!!");

        ImageWriter imageWriter = imageWriters.next();
        ImageOutputStream imageOutputStream = ImageIO.createImageOutputStream(outputStream);
        imageWriter.setOutput(imageOutputStream);

        ImageWriteParam imageWriteParam = imageWriter.getDefaultWriteParam();

        //Set the compress quality metrics
        imageWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
        imageWriteParam.setCompressionQuality(imageQuality);

        //Created image
        imageWriter.write(null, new IIOImage(concatImage, null, null), imageWriteParam);

        // close all streams
        outputStream.close();
        imageOutputStream.close();
        imageWriter.dispose();
        log.info(" Files Merged");
        } catch (IOException e) {
            log.error("Error while merging files :::"+e);
            throw new RuntimeException(e);
        }
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.