/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.commons.imaging.examples;

import java.awt.Dimension;
import java.awt.color.ICC_Profile;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.imaging.FormatCompliance;
import org.apache.commons.imaging.ImageFormat;
import org.apache.commons.imaging.ImageFormats;
import org.apache.commons.imaging.ImageInfo;
import org.apache.commons.imaging.Imaging;
import org.apache.commons.imaging.common.IImageMetadata;

public class SampleUsage {

    public SampleUsage() {

        try {
            // <b>Code won't work unless these variables are properly
            // initialized.
            // Imaging works equally well with File, byte array or InputStream
            // inputs.</b>
            final BufferedImage someImage = null;
            final byte someBytes[] = null;
            final File someFile = null;
            final InputStream someInputStream = null;
            final OutputStream someOutputStream = null;

            // <b>The Imaging class provides a simple interface to the library.
            // </b>

            // <b>how to read an image: </b>
            final byte imageBytes[] = someBytes;
            final BufferedImage image_1 = Imaging.getBufferedImage(imageBytes);

            // <b>methods of Imaging usually accept files, byte arrays, or
            // inputstreams as arguments. </b>
            final BufferedImage image_2 = Imaging.getBufferedImage(imageBytes);
            final File file = someFile;
            final BufferedImage image_3 = Imaging.getBufferedImage(file);
            final InputStream is = someInputStream;
            final BufferedImage image_4 = Imaging.getBufferedImage(is);

            // <b>Write an image. </b>
            final BufferedImage image = someImage;
            final File dst = someFile;
            final ImageFormat format = ImageFormats.PNG;
            final Map<String,Object> optional_params = new HashMap<String,Object>();
            Imaging.writeImage(image, dst, format, optional_params);

            final OutputStream os = someOutputStream;
            Imaging.writeImage(image, os, format, optional_params);

            // <b>get the image's embedded ICC Profile, if it has one. </b>
            final byte iccProfileBytes[] = Imaging.getICCProfileBytes(imageBytes);

            final ICC_Profile iccProfile = Imaging.getICCProfile(imageBytes);

            // <b>get the image's width and height. </b>
            final Dimension d = Imaging.getImageSize(imageBytes);

            // <b>get all of the image's info (ie. bits per pixel, size,
            // transparency, etc.) </b>
            final ImageInfo imageInfo = Imaging.getImageInfo(imageBytes);

            if (imageInfo.getColorType() == ImageInfo.COLOR_TYPE_GRAYSCALE) {
                System.out.println("Grayscale image.");
            }
            if (imageInfo.getHeight() > 1000) {
                System.out.println("Large image.");
            }

            // <b>try to guess the image's format. </b>
            final ImageFormat image_format = Imaging.guessFormat(imageBytes);
            image_format.equals(ImageFormats.PNG);

            // <b>get all metadata stored in EXIF format (ie. from JPEG or
            // TIFF). </b>
            final IImageMetadata metadata = Imaging.getMetadata(imageBytes);

            // <b>print a dump of information about an image to stdout. </b>
            Imaging.dumpImageFile(imageBytes);

            // <b>get a summary of format errors. </b>
            final FormatCompliance formatCompliance = Imaging
                    .getFormatCompliance(imageBytes);

        } catch (final Exception e) {

        }
    }
}
