Проверьте, является ли файл изображением - PullRequest
9 голосов
/ 03 февраля 2010

Я использую JAI и создаю файл с:

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

Перед этой строкой я проверяю, существует ли файл. Но как я могу проверить, является ли файл .bmp или .tiff или файл изображения?

Кто-нибудь знает?

Ответы [ 9 ]

8 голосов
/ 03 февраля 2010

Проект Image Magick имеет средства для идентификации изображения, и есть Java-оболочка для Image Magick под названием JMagick, которую, я думаю, вы, возможно, захотите рассмотреть вместо того, чтобы заново изобретать колесо:

http://www.jmagick.org

Я все время использую Image Magick, включая функцию «идентифицировать» из командной строки, и мне никогда не удавалось идентифицировать изображение.

В те времена, когда мне абсолютно требовалась эта функция, и JMagick не делал этого.еще не существовало. Я использовал команду Runtime.exec() ImageMagick identify из Java, и она отлично работала.

В настоящее время, когда существует 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
4 голосов
/ 13 июня 2012

Попробуйте использовать ширину изображения:

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

если ширина равна -1, то это не изображение.

3 голосов
/ 17 октября 2012

Чтобы узнать, является ли что-то 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;
}
1 голос
/ 03 февраля 2010

В начале файлов есть последовательность идентифицирующих символов. Например, файлы JPEG начинаются с FF D8 FF.

Вы можете проверить эту последовательность в своей программе, но я не уверен, работает ли она для каждого файла.

Для получения информации об идентификации символов вы можете посмотреть на http://filext.com

1 голос
/ 03 февраля 2010

Вы можете использовать DROID , инструмент для идентификации формата файла, который также предлагает Java API, который будет использоваться примерно так:

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

Документация по использованию API довольно скудна, но вы можете взглянуть на этот рабочий пример (интересная часть в методе identifyOneBinary).

0 голосов
/ 21 марта 2016
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);
                }
0 голосов
/ 03 февраля 2010

Попробуйте использовать стандартную JavaBeans Activation Framework (JAF)

Со стандартным расширением JavaBeans Activation Framework разработчики, использующие технологию Java, могут использовать стандартные службы для определения типа произвольной части данных , инкапсулирования доступа к ней, обнаружения операций, доступных на ней и для создания экземпляра соответствующего компонента для выполнения указанных операций. Например, если браузер получил изображение JPEG, эта структура позволит браузеру идентифицировать этот поток данных как изображение JPEG , и по этому типу браузер сможет найти и создать объект, который может манипулировать или просмотрите это изображение.

0 голосов
/ 03 февраля 2010

Расширяя ответ Биркана, здесь есть список «магических чисел», доступных здесь:

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 для редактирования файлов, а затем сделал Tools | Конвертировать в Hex, но вы также можете использовать 'od -c' или что-то подобное, чтобы проверить их.

В общем, я был немного удивлен, когда узнал магические числа, используемые для скомпилированных Java-классов: 'ca fe ba be' - 'cafe babe':)

0 голосов
/ 03 февраля 2010

Единственный (полу) надежный способ определить содержимое файла - это открыть его и прочитать первые несколько символов.Затем вы можете использовать набор тестов, таких как реализованные в файловой команде Unix, чтобы сделать обоснованное предположение о содержимом файла.

...