জাভা ব্যবহার করে কীভাবে চিত্রের উচ্চতা এবং প্রস্থ পাবেন?


106

চিত্রের উচ্চতা এবং প্রস্থ পাওয়ার জন্য ImageIO.read ব্যবহার ছাড়াও কি অন্য কোনও উপায় আছে ?

কারণ আমি এমন একটি সমস্যার মুখোমুখি হই যা থ্রেডটিকে লক করে দেয়।

at com.sun.medialib.codec.jpeg.Decoder.njpeg_decode(Native Method)      
at com.sun.medialib.codec.jpeg.Decoder.decode(Decoder.java:87)      
at com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReader.decode(CLibJPEGImageReader.java:73)     
 - locked <0xd96fb668> (a com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReader)      
at com.sun.media.imageioimpl.plugins.clib.CLibImageReader.getImage(CLibImageReader.java:320)    
 - locked <0xd96fb668> (a com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReader)     
 at com.sun.media.imageioimpl.plugins.clib.CLibImageReader.read(CLibImageReader.java:384)   
 - locked <0xd96fb668> (a com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReader)      
at javax.imageio.ImageIO.read(ImageIO.java:1400)      
at javax.imageio.ImageIO.read(ImageIO.java:1322)

এই ত্রুটিটি কেবল একটি সান অ্যাপ্লিকেশন সার্ভারে ঘটে এবং তাই আমি সন্দেহ করি যে এটি একটি সান বাগ।


কি ত্রুটি? আপনি কেবল স্ট্যাক ট্রেসের একটি অংশ দেখান (এটি দেখে মনে হয় jstack)।
জোছিম সউর

আপনি কি এই সমস্যার কারণ বা সমাধান খুঁজে পেয়েছেন? আমি একই সমস্যাটি পেয়েছি যেখানে এটি একই পদ্ধতিতে থ্রেডটি লক করছে।
টিমোথি চেন

একটি বাগ রয়েছে যা সম্পর্কিত হতে পারে: bugs.sun.com/bugdatedia/view_bug.do?bug_id=6791502
অ্যাডাম শ্মিদেগ

উত্তর:


288

এখানে খুব সহজ এবং সহজ কিছু।

BufferedImage bimg = ImageIO.read(new File(filename));
int width          = bimg.getWidth();
int height         = bimg.getHeight();

7
এটি একটি দীর্ঘ পথ দ্বারা সেরা উত্তর, এবং আপনি আপনার পোস্টের 17 দিনের পরে অন্য কেউ পোস্ট করেছেন একই উত্তর দিয়ে ভোট প্রতারণা করেছেন। এটি শীর্ষের উত্তরটি হওয়া উচিত নীচের দিকে নয়।
ওভারস্টিয়ার

34
আমি যে যা পড়ছি তা থেকে এটি পুরো চিত্রটি মেমোরিতে পড়ে। প্রস্থ এবং উচ্চতা পেতে যা চরম।
মার্ক

7
খারাপ উপায়: আপনাকে পুরো ইমেজ
রাস্টারটিকে

4
প্রশ্নটি বিশেষত ইমেজআইও.আরড ব্যবহার ব্যতীত অন্য কোনও উপায়ের জন্য চায় । আপনার উত্তরটি হ'ল "ImageIO.read ব্যবহার করুন"। কেন এটি একটি উত্তরের উত্তর হিসাবে বিবেচিত হয়?
ssimm

5
এটি করার জন্য এটি সবচেয়ে খারাপ উপায় এবং কেন এটি এত বেশি ভারী করা হয়েছে তা আমি পাই না get এটি পুরো চিত্রটি গাদাতে লোড করে যা ধীর এবং প্রচুর অপ্রয়োজনীয় স্মৃতি গ্রহণ করে।
প্যাট্রিক ফ্যাভ্রে

72

এটি @Kay এর দুর্দান্ত পোস্টটির পুনঃলিখন, যা আইওএক্সেপশন ছুড়ে দেয় এবং প্রারম্ভিক প্রস্থান দেয়:

/**
 * Gets image dimensions for given file 
 * @param imgFile image file
 * @return dimensions of image
 * @throws IOException if the file is not a known image
 */
public static Dimension getImageDimension(File imgFile) throws IOException {
  int pos = imgFile.getName().lastIndexOf(".");
  if (pos == -1)
    throw new IOException("No extension for file: " + imgFile.getAbsolutePath());
  String suffix = imgFile.getName().substring(pos + 1);
  Iterator<ImageReader> iter = ImageIO.getImageReadersBySuffix(suffix);
  while(iter.hasNext()) {
    ImageReader reader = iter.next();
    try {
      ImageInputStream stream = new FileImageInputStream(imgFile);
      reader.setInput(stream);
      int width = reader.getWidth(reader.getMinIndex());
      int height = reader.getHeight(reader.getMinIndex());
      return new Dimension(width, height);
    } catch (IOException e) {
      log.warn("Error reading: " + imgFile.getAbsolutePath(), e);
    } finally {
      reader.dispose();
    }
  }

  throw new IOException("Not a known image file: " + imgFile.getAbsolutePath());
}

আমার ধারণা আমার ইনপুটটি উত্তর হিসাবে উপযুক্ত হিসাবে বিবেচিত হওয়ার জন্য আমার প্রতিনিধি যথেষ্ট উচ্চ নয় not


এর জন্য ধন্যবাদ! এবং ব্যবহারকারী 194715 দ্বারা সম্পাদিত পারফরম্যান্স তুলনা বিবেচনা করে, আমি পারফরম্যান্স এবং পিএনজি বিবেচনার জন্য আপনার পরামর্শ গ্রহণ করব! ধন্যবাদ!
আহ-শিয়াং হান

আপনি যদি ফাইলের ধরণের বিষয়ে কিছু হতে চান তবে তার সাথে মিলিয়ে nio.Files প্যাকেজ থেকে প্রোব কনটেন্টটাইপও ব্যবহার javax.imageio.ImageIO.getImageReadersByMIMEType(mimeType)করতে পারেন না?
এজক্যাসবার্গ

3
এছাড়াও, .close()আপনি ফিরে আসার আগে আপনার স্ট্রিমে কল করা উচিত নয় ? অন্যথায় আপনি স্ট্রিমটি উন্মুক্ত রেখে দিন
এজকেসবার্গ

1
@ php_coder_3809625 লগটি পুনরাবৃত্তির মধ্যে রয়েছে, সুতরাং এটির চিত্রটি হতে পারে যে কোনও চিত্রের রিডার ব্যর্থ হয় তবে পরবর্তীকালে সফল হয়। যদি তারা সমস্ত ব্যর্থ হয়, তবে একটি আইওএক্সেপশন উত্থাপিত হয়।
অ্যান্ড্রু টেলর

1
আপনি org.apache.commons.io.FilenameUtils#getExtensionফাইলের নাম এক্সটেনশন সনাক্ত করার জন্য ব্যবহার বিবেচনা করতে পারেন ।
প্যাট্রিক বার্গনার

52

আমি চিত্রের আকার পড়ার জন্য আরও একটি উপায় খুঁজে পেয়েছি (আরও জেনেরিক)। আপনি চিত্রগ্রাহকদের সাথে সহযোগিতায় ইমেজআইও ক্লাস ব্যবহার করতে পারেন। নমুনা কোডটি এখানে:

private Dimension getImageDim(final String path) {
    Dimension result = null;
    String suffix = this.getFileSuffix(path);
    Iterator<ImageReader> iter = ImageIO.getImageReadersBySuffix(suffix);
    if (iter.hasNext()) {
        ImageReader reader = iter.next();
        try {
            ImageInputStream stream = new FileImageInputStream(new File(path));
            reader.setInput(stream);
            int width = reader.getWidth(reader.getMinIndex());
            int height = reader.getHeight(reader.getMinIndex());
            result = new Dimension(width, height);
        } catch (IOException e) {
            log(e.getMessage());
        } finally {
            reader.dispose();
        }
    } else {
        log("No reader found for given format: " + suffix));
    }
    return result;
}

নোট করুন যে getFileSuffix এমন একটি পদ্ধতি যা "ছাড়াই পথের সম্প্রসারণ ফিরিয়ে দেয়।" উদাহরণস্বরূপ: পিএনজি, জেপিজি ইত্যাদি বাস্তবায়ন উদাহরণ:

private String getFileSuffix(final String path) {
    String result = null;
    if (path != null) {
        result = "";
        if (path.lastIndexOf('.') != -1) {
            result = path.substring(path.lastIndexOf('.'));
            if (result.startsWith(".")) {
                result = result.substring(1);
            }
        }
    }
    return result;
}

এই চিত্রটি খুব দ্রুত কারণ কেবল চিত্রের আকার ফাইল থেকে পড়ে এবং পুরো চিত্রটি নয়। আমি এটি পরীক্ষা করেছি এবং ইমেজআইও.ড্রিড পারফরম্যান্সের সাথে কোনও তুলনা নেই। আমি আশা করি যে কেউ এই দরকারী পাবেন।


getFileSuffix()অপ্রয়োজনীয় আইএফ রয়েছে এবং প্রারম্ভিক nullহওয়া এই ক্ষেত্রে কোনও ভাল ধারণা নয়।
জিমি টি।

2
হ্যাঁ এই "মূলত খুব দ্রুত"! আমি মনে করি আপনি সেই বছরের সাথে 'বছরের আউটসেটমেন্টের জন্য' যোগ্যতা অর্জন করেছেন। ImageIO.read()সিপিইউ সময় এবং মেমরি ব্যবহারের ক্ষেত্রে উভয় ক্ষেত্রেই পুরোপুরি পানির বাইরে ফুঁক দেয় ।
aroth

1
পাবলিক স্ট্যাটিক স্ট্রিং getFileSuffix (চূড়ান্ত স্ট্রিং পাথ) {যদি (পাথ! = নাল && পাথ lastlastIndexOf ('।')! = -1) {ফেরার পথ.সুবস্ট্রিং (path.lastIndexOf ('।'))। স্ট্রিং (1) ; } রিটার্ন নাল; }
নীলাঞ্চল

47

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

1(Apurv) - 101454ms, 84611ms
2(joinJpegs) - 471ms, N/A
3(Andrew Taylor) - 707ms, 68ms
4(Karussell, ImageIcon) - 106655ms, 100898ms
5(user350756) - 2649ms, 68ms

এটি সুস্পষ্ট যে কিছু পদ্ধতিগুলি মাত্রা পেতে পুরো ফাইলটি লোড করে আবার অন্যরা কেবল চিত্র থেকে কিছু শিরোনামের তথ্য পড়ে get আমি মনে করি যখন এই অ্যাপ্লিকেশন কর্মক্ষমতা সমালোচনামূলক হয় তখন এই সংখ্যাগুলি কার্যকর হতে পারে।

এই থ্রেডের অবদানের জন্য আপনাকে সবাইকে ধন্যবাদ - খুব সহায়ক।


3
এখন এটি একটি উত্তর। ভাল করেছ!
ssimm

1
আপনি যখন ছবি আপলোড করার সময় হিপ স্পেস ব্যবহার বিশ্লেষণ করেছেন? এছাড়াও, কোনও পরীক্ষায় এই পরীক্ষা চালানোর সময় আপনি কি কোনও ওওএম ত্রুটি পেয়েছেন?
সাইবারথ

ধন্যবাদ আপনার উত্তর আমাকে অনেক সাহায্য করেছে। আমার কাছে (50 কে এইচডি পিক)
সনিয়ার

17

আপনি ফাইল হিসাবে জেপিগ বাইনারি ডেটা লোড করতে পারেন এবং নিজে জেপিগ শিরোনামকে পার্স করতে পারেন। আপনি যেটির সন্ধান করছেন সেটি হ'ল 0xFFC0 বা ফ্রেম শিরোনামের শুরু:

Start of frame marker (FFC0)

* the first two bytes, the length, after the marker indicate the number of bytes, including the two length bytes, that this header contains
* P -- one byte: sample precision in bits (usually 8, for baseline JPEG)
* Y -- two bytes
* X -- two bytes
* Nf -- one byte: the number of components in the image
      o 3 for color baseline JPEG images
      o 1 for grayscale baseline JPEG images

* Nf times:
      o Component ID -- one byte
      o H and V sampling factors -- one byte: H is first four bits and V is second four bits
      o Quantization table number-- one byte

The H and V sampling factors dictate the final size of the component they are associated with. For instance, the color space defaults to YCbCr and the H and V sampling factors for each component, Y, Cb, and Cr, default to 2, 1, and 1, respectively (2 for both H and V of the Y component, etc.) in the Jpeg-6a library by the Independent Jpeg Group. While this does mean that the Y component will be twice the size of the other two components--giving it a higher resolution, the lower resolution components are quartered in size during compression in order to achieve this difference. Thus, the Cb and Cr components must be quadrupled in size during decompression.

শিরোনামগুলি সম্পর্কে আরও তথ্যের জন্য উইকিপিডিয়াটির জেপিগ এন্ট্রি পরীক্ষা করে দেখুন বা আমি উপরের তথ্যটি এখানে পেয়েছি ।

আমি নীচের কোডটির অনুরূপ একটি পদ্ধতি ব্যবহার করেছি যা সূর্য ফোরামে এই পোস্টটি থেকে পেয়েছি :

import java.awt.Dimension;
import java.io.*;

public class JPEGDim {

public static Dimension getJPEGDimension(File f) throws IOException {
    FileInputStream fis = new FileInputStream(f);

    // check for SOI marker
    if (fis.read() != 255 || fis.read() != 216)
        throw new RuntimeException("SOI (Start Of Image) marker 0xff 0xd8 missing");

    Dimension d = null;

    while (fis.read() == 255) {
        int marker = fis.read();
        int len = fis.read() << 8 | fis.read();

        if (marker == 192) {
            fis.skip(1);

            int height = fis.read() << 8 | fis.read();
            int width = fis.read() << 8 | fis.read();

            d = new Dimension(width, height);
            break;
        }

        fis.skip(len - 2);
    }

    fis.close();

    return d;
}

public static void main(String[] args) throws IOException {
    System.out.println(getJPEGDimension(new File(args[0])));
}

}


ভাল. তবে আমি মনে করি এর পরিবর্তে ==192196, 200 এবং 204 ব্যতীত 192-27 সংখ্যাটি পরীক্ষা করা উচিত
ভেরটেক্সওয়াল্ফ 2:34

অথবা আপনি com.drewnoakes.metadata-extractorসহজেই এই শিরোনামগুলি বের করতে লাইব্রেরিটি ব্যবহার করতে পারেন
ভিক্টর পেটিট

9

সহজ উপায়:

BufferedImage readImage = null;

try {
    readImage = ImageIO.read(new File(your path);
    int h = readImage.getHeight();
    int w = readImage.getWidth();
} catch (Exception e) {
    readImage = null;
}

3
এটি কেবল প্রস্থ এবং উচ্চতা জানার জন্য মেমরিতে পুরো চিত্রটি পড়তে হবে। হ্যাঁ, এটি সহজ, তবে অনেকগুলি চিত্র বা বিশাল চিত্রের জন্য খারাপ অভিনয় করবে ...
ক্লিন্ট ইস্টউড

4

ইমেজআইও.ড্রেডের সমস্যাটি হ'ল এটি সত্যই ধীর। আকারটি পেতে আপনাকে যা করতে হবে তা হ'ল চিত্র শিরোনামটি। ImageIO.getImageReaderনিখুঁত প্রার্থী।

এখানে গ্রোভির উদাহরণ দেওয়া আছে তবে একই জিনিস জাভাতে প্রযোজ্য

def stream = ImageIO.createImageInputStream(newByteArrayInputStream(inputStream))
def formatReader = ImageIO.getImageWritersByFormatName(format).next() 
def reader = ImageIO.getImageReader(formatReader)
reader.setInput(stream, true)

println "width:reader.getWidth(0) -> height: reader.getHeight(0)"

পারফরম্যান্সটি সিম্পলজিমেজইনফো জাভা লাইব্রেরি ব্যবহার করার মতোই ছিল।

https://github.com/cbeust/personal/blob/master/src/main/java/com/beust/SimpleImageInfo.java


কী getReaderByFormat?
কোরে তুগয়ে

3

আপনি টুলকিটটি ব্যবহার করতে পারেন, চিত্রের দরকার নেই

Image image = Toolkit.getDefaultToolkit().getImage(file.getAbsolutePath());
int width = image.getWidth(null);
int height = image.getHeight(null);

আপনি যদি চিত্রটি লোড হ্যান্ডেল করতে না চান

ImageIcon imageIcon = new ImageIcon(file.getAbsolutePath());
int height = imageIcon.getIconHeight();
int width = imageIcon.getIconWidth();

1
ইমেজআইওর প্রয়োজন নেই তবে সরঞ্জামদণ্ডের প্রয়োজন। পার্থক্য কি?
ডাইটার

ইমেজআইও একটি বাহ্যিক নির্ভরতা। টুলকিট নয়
কার্সেল

ImageIO 1.4 যেহেতু জাভা অংশ docs.oracle.com/javase/7/docs/api/javax/imageio/...
Dieter

হ্যাঁ, সম্ভবত এটি কাজ করবে, দুঃখিত যদি এটি বিভ্রান্তিকর হয়। : যখন আমি এটা চেষ্টা আমি কিছু অংশ জন্য Jai জিনিস (? হয়তো অন্যান্য ফরম্যাটের পড়তে) প্রয়োজন stackoverflow.com/questions/1209583/...
Karussell

3

আপনি জাভা ব্যবহার করে বাফারডেমেজ বস্তুর সাহায্যে চিত্রের প্রস্থ এবং উচ্চতা পেতে পারেন।

public void setWidthAndHeightImage(FileUploadEvent event){
    byte[] imageTest = event.getFile().getContents();
                baiStream = new ByteArrayInputStream(imageTest );
                BufferedImage bi = ImageIO.read(baiStream);
                //get width and height of image
                int imageWidth = bi.getWidth();
                int imageHeight = bi.getHeight();
    }

এটি মেমরিতে পুরো চিত্রটি লোড করবে, খুব অপচয় এবং খুব ধীর।
argoden

1

ইমেজআইও.ড্রেড সহ একটি বাফার ইমেজ পাওয়া খুব ভারী পদ্ধতি, কারণ এটি মেমরিতে চিত্রের সম্পূর্ণ সঙ্কুচিত কপি তৈরি করে। পিএনজি'র জন্য আপনি পিএনজি এবং কোডও ব্যবহার করতে পারেন:

if (png)
    PngReader pngr = new PngReader(file);
    width = pngr.imgInfo.cols;
    height = pngr.imgInfo.rows;
    pngr.close();
}

0

সঙ্গে লড়াই হচ্ছে ImageIOগত বছর একটি অনেক, আমি মনে করি অ্যান্ড্রু টেলর এর সমাধান পর্যন্ত সেরা আপস হয় (দ্রুত: ব্যবহার করছেন না ImageIO#read, এবং বহুমুখী)। ধন্যবাদ মানুষ!!

তবে আমি একটি স্থানীয় ফাইল (ফাইল / স্ট্রিং) ব্যবহার করতে বাধ্য হতে পেরে কিছুটা হতাশ হয়েছিলাম, বিশেষত আপনি যেখানে চিত্রের আকারগুলি দেখতে চান তা বলুন, যেখানে আপনি সাধারণত InputPart/ পুনরুদ্ধার করেন এমন একটি মাল্টিপার্ট / ফর্ম-ডেটা অনুরোধ InputStream। তাই আমি দ্রুত একটি বৈকল্পিক যে গ্রহণ করে প্রণীত File, InputStreamএবং RandomAccessFileক্ষমতা উপর ভিত্তি করে,ImageIO#createImageInputStream তা করার।

অবশ্যই, এর সাথে এই জাতীয় পদ্ধতিটি Object inputকেবল ব্যক্তিগত থাকতে পারে এবং আপনি এটিকে কল করে প্রয়োজনীয় হিসাবে অনেকগুলি পলিমারফিক পদ্ধতি তৈরি করতে পারবেন। এছাড়াও আপনি গ্রহণ করতে পারে Pathসঙ্গে Path#toFile()এবং URLসঙ্গে URL#openStream()এই পদ্ধতি থেকে পাশ করার পূর্বে:

  private static Dimension getImageDimensions(Object input) throws IOException {

    try (ImageInputStream stream = ImageIO.createImageInputStream(input)) { // accepts File, InputStream, RandomAccessFile
      if(stream != null) {
        IIORegistry iioRegistry = IIORegistry.getDefaultInstance();
        Iterator<ImageReaderSpi> iter = iioRegistry.getServiceProviders(ImageReaderSpi.class, true);
        while (iter.hasNext()) {
          ImageReaderSpi readerSpi = iter.next();
          if (readerSpi.canDecodeInput(stream)) {
            ImageReader reader = readerSpi.createReaderInstance();
            try {
              reader.setInput(stream);
              int width = reader.getWidth(reader.getMinIndex());
              int height = reader.getHeight(reader.getMinIndex());
              return new Dimension(width, height);
            } finally {
              reader.dispose();
            }
          }
        }
        throw new IllegalArgumentException("Can't find decoder for this image");
      } else {
        throw new IllegalArgumentException("Can't open stream for this image");
      }
    }
  }

-1

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

আমি অ্যাপ্লিকেশন দ্বারা উত্পন্ন কোনও চিত্রের প্রস্থ পেতে এই যাচাইয়ের সহজ পদ্ধতিটি ব্যবহার করছি এবং যাচাইকরণের জন্য পরে আপলোড করতে হবে:

Pls। দ্রষ্টব্য: আপনি অ্যাক্সেস স্টোরেজ জন্য ম্যানিফেস্টে অনুমতি সক্ষম করতে হবে।

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

public static int getImageWidthOrHeight(String imgFilePath) {

            Log.d("img path : "+imgFilePath);

            // Decode image size
            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;
            BitmapFactory.decodeFile(imgFilePath, o);

            int width_tmp = o.outWidth, height_tmp = o.outHeight;

            Log.d("Image width : ", Integer.toString(width_tmp) );

            //you can decide to rather return height_tmp to get the height.

            return width_tmp;

}


হ্যালো @ জিপাসাচ কীভাবে? আপনি কি এটা চেষ্টা করেছেন ? এটি আমার জন্য নিখুঁতভাবে কাজ করছে। অন্যান্য উদাহরণগুলির মধ্যে আমার পক্ষে কাজ হয়নি। কিছু আমাকে ক্লাসের কিছু অদ্ভুত আমদানি করতে বাধ্যতামূলক করেছিল এবং অন্যদের কারণে সমস্যা সৃষ্টি হয়েছিল। আপনার চ্যালেঞ্জগুলি কী ছিল তা থেকে আমি সত্যিই আরও জানতে চাই। পাশে দাঁড়িয়ে। । ।
অ্যাপেমানুয়েল

-2

ইএমএফ চিত্র পাঠক ছাড়াই ইমফ ফাইলের আকার পেতে আপনি কোডটি ব্যবহার করতে পারেন:

Dimension getImageDimForEmf(final String path) throws IOException {

    ImageInputStream inputStream = new FileImageInputStream(new File(path));

    inputStream.setByteOrder(ByteOrder.LITTLE_ENDIAN);

    // Skip magic number and file size
    inputStream.skipBytes(6*4);

    int left   = inputStream.readInt();
    int top    = inputStream.readInt();
    int right  = inputStream.readInt();
    int bottom = inputStream.readInt();

    // Skip other headers
    inputStream.skipBytes(30);

    int deviceSizeInPixelX = inputStream.readInt();
    int deviceSizeInPixelY = inputStream.readInt();

    int deviceSizeInMlmX = inputStream.readInt();
    int deviceSizeInMlmY = inputStream.readInt();

    int widthInPixel = (int) Math.round(0.5 + ((right - left + 1.0) * deviceSizeInPixelX / deviceSizeInMlmX) / 100.0);
    int heightInPixel = (int) Math.round(0.5 + ((bottom-top + 1.0) * deviceSizeInPixelY / deviceSizeInMlmY) / 100.0);

    inputStream.close();

    return new Dimension(widthInPixel, heightInPixel);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.