سؤال

أنا أستخدم JAI وإنشاء ملف مع:

PlanarImage img = JAI.create("fileload", myFilename);

أتحقق قبل هذا السطر إذا كان الملف موجودًا. ولكن كيف يمكنني التحقق مما إذا كان الملف هو .bmp أو .tiff أو ملف صورة؟

هل يعلم أحد؟

هل كانت مفيدة؟

المحلول

يحتوي مشروع Image Magick على مرافق لتحديد الصورة وهناك غلاف Java لـ Image Magick يسمى Jmagick والذي أعتقد أنك قد ترغب في التفكير فيه بدلاً من إعادة اختراع العجلة:

http://www.jmagick.org

أنا أستخدم Image Magick طوال الوقت ، بما في ذلك ميزة "تحديد" من سطر الأوامر ولم يفشل أبدًا في تحديد الصورة.

مرة أخرى في الأيام التي احتجت فيها تمامًا إلى هذه الميزة ولم يكن JMagick موجودًا بعد اعتدت على ذلك Runtime.exec() ImageMagick identify القيادة من جافا وعملت تماما.

في الوقت الحاضر ، ربما لم يعد هناك Jmagick هذا ضروريًا بعد الآن (لكنني لم أحاول Jmagick بعد).

لاحظ أنه يعطي أكثر بكثير من مجرد التنسيق ، على سبيل المثال:

$  identify tmp3.jpg 
tmp3.jpg JPEG 1680x1050 1680x1050+0+0 DirectClass 8-bit 293.582kb 

$  identify tmp.png
tmp.png PNG 1012x900 1012x900+0+0 DirectClass 8-bit 475.119kb

نصائح أخرى

حاول استخدام عرض الصورة:

boolean isImage(String image_path){
  Image image = new ImageIcon(image_path).getImage();
  if(image.getWidth(null) == -1){
        return false;
  }
  else{
        return true;
  }
}

إذا كان العرض -1 فهو ليس صورة.

لمعرفة ما إذا كان شيء ما هو PNG ، لقد استخدمت هذا المقتطف أدناه في Android Java.

public CompressFormat getCompressFormat(Context context, Uri fileUri) throws IOException {
    // create input stream
    int numRead;
    byte[] signature = new byte[8];
    byte[] pngIdBytes = { -119, 80, 78, 71, 13, 10, 26, 10 };
    InputStream is = null;

    try {
        ContentResolver resolver = context.getContentResolver();
        is = resolver.openInputStream(fileUri);

        // if first 8 bytes are PNG then return PNG reader
        numRead = is.read(signature);

        if (numRead == -1)
            throw new IOException("Trying to reda from 0 byte stream");

    } finally {
        if (is != null)
            is.close();
    }

    if (numRead == 8 && Arrays.equals(signature, pngIdBytes)) {
        return CompressFormat.PNG;
    }

    return null;
}

في بداية الملفات ، هناك تسلسل حرف تحديد. على سبيل المثال ، تبدأ ملفات JPEG بـ FF D8 FF.

يمكنك التحقق من هذا التسلسل في برنامجك ، لكنني لست متأكدًا مما إذا كان هذا يعمل لكل ملف.

للحصول على معلومات حول تحديد الأحرف التي يمكنك إلقاء نظرة عليها http://filext.com

يمكنك استخدام الروبوت, ، أداة لتحديد تنسيق الملفات التي توفر أيضًا واجهة برمجة تطبيقات Java ، لاستخدامها تقريبًا مثل هذا:

AnalysisController controller = new AnalysisController();
controller.readSigFile(signatureFileLocation);
controller.addFile(fileToIdentify.getAbsolutePath());
controller.runFileFormatAnalysis();
Iterator<IdentificationFile> it = controller.getFileCollection().getIterator();

الوثائق المتعلقة باستخدام API ضئيل إلى حد ما ، ولكن يمكنك إلقاء نظرة على هذا مثال العمل (الجزء المثير للاهتمام في identifyOneBinary طريقة).

الطريقة الوحيدة (شبه الموثوقة) لتحديد محتويات الملف هي فتحه وقراءة الأحرف القليلة الأولى. بعد ذلك ، يمكنك استخدام مجموعة من الاختبارات مثل تنفيذها في أمر ملف UNIX لإجراء تخمين متعلم بشأن محتويات الملف.

التوسع في إجابة بيركان ، هناك قائمة بـ "الأرقام السحرية" المتاحة هنا:

http://www.astro.keele.ac.uk/oldusers/rno/computing/file_magic.html

لقد راجعت للتو ملف BMP و TIFF (كلاهما تم إنشاؤه للتو في Windows XP / Paint) ، ويبدو أنهما صحيحان:

First two bytes "42 4d" -> BMP
First four bytes "4d 4d 00 2a" -> TIFF

لقد استخدمت VIM لتحرير الملفات ثم فعلت الأدوات | تحويل إلى Hex ، ولكن يمكنك أيضًا استخدام "OD -C" أو شيء مشابه للتحقق منها.

كإكمال ، كنت مستمتعًا قليلاً عندما اكتشفت الأرقام السحرية المستخدمة في فصول Java المترجمة: 'ca fe be' - 'Cafe Babe' :)

حاول استخدام المعيار إطار تنشيط Javabeans (JAF)

مع امتداد Javabeans Activation Framework Standard ، يمكن للمطورين الذين يستخدمون تقنية Java الاستفادة من الخدمات القياسية تحديد نوع البيانات التعسفية, ، قم بتغليف الوصول إليها ، واكتشف العمليات المتاحة عليها ، وللأخذ في إنشاء الفول المناسب لأداء العمليات (العمليات) المذكورة. على سبيل المثال ، إذا حصل المتصفح على صورة JPEG ، فسيتمكن هذا الإطار من المتصفح لتحديد دفق البيانات هذا كصورة JPEG, ، ومن هذا النوع ، يمكن للمستعرض تحديد موقع كائن وتأسيسه الذي يمكن أن يتلاعب ، أو عرض تلك الصورة.

if(currentImageType ==null){
                    ByteArrayInputStream is = new ByteArrayInputStream(image);
                    String mimeType = URLConnection.guessContentTypeFromStream(is);
                    if(mimeType == null){
                        AutoDetectParser parser = new AutoDetectParser();
                        Detector detector = parser.getDetector();
                        Metadata md = new Metadata();
                        mimeType = detector.detect(is,md).toString();

                        if (mimeType.contains("pdf")){
                            mimeType ="pdf";
                        }
                        else if(mimeType.contains("tif")||mimeType.contains("tiff")){
                            mimeType = "tif";
                        }
                    }
                    if(mimeType.contains("png")){
                        mimeType ="png";
                    }
                    else if( mimeType.contains("jpg")||mimeType.contains("jpeg")){
                        mimeType = "jpg";
                    }
                    else if (mimeType.contains("pdf")){
                        mimeType ="pdf";
                    }
                    else if(mimeType.contains("tif")||mimeType.contains("tiff")){
                        mimeType = "tif";
                    }

                    currentImageType = ImageType.fromValue(mimeType);
                }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top