input == null для каталога изображений - PullRequest
0 голосов
/ 02 июля 2018

У меня есть программа для поиска метаданных для каталога изображений. Я могу найти метаданные для 1 изображения, но не могу сделать это для второго изображения.

Я попытался file.exists, чтобы проверить, как ведет себя мой объект File, и он сообщает только для 1-го изображения. Это работает для этого конкретного изображения, хотя все мои изображения в одном формате (JPG).

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

 public class Metadata{
        private final static Logger LOG = LoggerFactory.getLogger(Metadata.class);
        public static void main(String[] args) {
            Metadata meta = new Metadata();

            Path dir = Paths.get("./images");
            try(DirectoryStream<Path> stream = Files.newDirectoryStream(dir)){

                int i = 0;
                for(Path file:stream){

                    System.out.println(file.getFileName().toString());//getting for both image
                    meta.readAndDisplayMetadata(file.getFileName().toString());
                }
            }catch(IOException IO){
            }
        }

        void readAndDisplayMetadata(String fileName ) {
            try {
                LOG.info(fileName);//working for both images
                File file = new File(fileName);
                if(file.exists())//not working for 1 image
                LOG.info(fileName);
                ImageInputStream iis = ImageIO.createImageInputStream(file);
                Iterator<ImageReader> readers = ImageIO.getImageReaders(iis); //Exception traces back here
                if (readers.hasNext()) {
                    ImageReader reader = readers.next();

                    reader.setInput(iis, true);

                    IIOMetadata metadata = reader.getImageMetadata(0);

                    String[] names = metadata.getMetadataFormatNames();
                    int length = names.length;
                    for (int i = 0; i < length; i++) {
                        System.out.println( "Format name: " + names[ i ] );
                        displayMetadata(metadata.getAsTree(names[i])); //consider this method is working
                    }
                }
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        } 

Это Консоль

JPG1_A.jpg
15:42:17.251 [main] INFO metadata.Metadata - JPG1_A.jpg
test.jpg
15:42:17.324 [main] INFO metadata.Metadata - test.jpg
java.lang.IllegalArgumentException: input == null! //EXCEPTION FOR JPEG_A.jpg
15:42:17.324 [main] INFO metadata.Metadata - test.jpg
    at javax.imageio.ImageIO.getImageReaders(ImageIO.java:641)
    at metadata.Metadata.readAndDisplayMetadata(Metadata.java:59)
    at metadata.Metadata.main(Metadata.java:33)

Format name: javax_imageio_jpeg_image_1.0
<javax_imageio_jpeg_image_1.0>
    <JPEGvariety>
        <app0JFIF majorVersion="1" minorVersion="1" resUnits="1" Xdensity="96" Ydensity="96" thumbWidth="0" thumbHeight="0"/>
    </JPEGvariety>
    <markerSequence>
        <dqt>
            <dqtable elementPrecision="0" qtableId="0"/>
        </dqt>
        <dqt>
            <dqtable elementPrecision="0" qtableId="1"/>
        </dqt>
        <sof process="0" samplePrecision="8" numLines="649" samplesPerLine="1280" numFrameComponents="3">
            <componentSpec componentId="1" HsamplingFactor="2" VsamplingFactor="2" QtableSelector="0"/>
            <componentSpec componentId="2" HsamplingFactor="1" VsamplingFactor="1" QtableSelector="1"/>
            <componentSpec componentId="3" HsamplingFactor="1" VsamplingFactor="1" QtableSelector="1"/>
        </sof>
        <dht>
            <dhtable class="0" htableId="0"/>
        </dht>
        <dht>
            <dhtable class="1" htableId="0"/>
        </dht>
        <dht>
            <dhtable class="0" htableId="1"/>
        </dht>
        <dht>
            <dhtable class="1" htableId="1"/>
        </dht>
        <sos numScanComponents="3" startSpectralSelection="0" endSpectralSelection="63" approxHigh="0" approxLow="0">
            <scanComponentSpec componentSelector="1" dcHuffTable="0" acHuffTable="0"/>
            <scanComponentSpec componentSelector="2" dcHuffTable="1" acHuffTable="1"/>
            <scanComponentSpec componentSelector="3" dcHuffTable="1" acHuffTable="1"/>
        </sos>
    </markerSequence>
</javax_imageio_jpeg_image_1.0>

Format name: javax_imageio_1.0
<javax_imageio_1.0>
    <Chroma>
        <ColorSpaceType name="YCbCr"/>
        <NumChannels value="3"/>
    </Chroma>
    <Compression>
        <CompressionTypeName value="JPEG"/>
        <Lossless value="FALSE"/>
        <NumProgressiveScans value="1"/>
    </Compression>
    <Dimension>
        <PixelAspectRatio value="1.0"/>
        <ImageOrientation value="normal"/>
        <HorizontalPixelSize value="0.26458332"/>
        <VerticalPixelSize value="0.26458332"/>
    </Dimension>
</javax_imageio_1.0>

Заранее спасибо.

1 Ответ

0 голосов
/ 02 июля 2018

Вы передаете только имя файла конструктору файлов. Итак, когда вы нашли путь ./images/JPG_A.jpg, вы создаете файл, используя new File("JPG_A.jpg"), и, таким образом, вы пытаетесь прочитать файл JPG_A.jpg в текущем каталоге, а не файл ./images/JPG_A.jpg. * 1004. *

Не передавайте имя файла вашему методу. Передайте полный объект Path. Преобразуйте путь к файлу, используя Path.toFile().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...