test/jdk/javax/imageio/plugins/shared/ImageWriterCompressionTest.java
author serb
Wed, 21 Feb 2018 12:49:00 -0800
changeset 49096 eaef201ec301
parent 47216 71c04702a3d5
permissions -rw-r--r--
8198333: ProblemList should be updated for headless mode Reviewed-by: psadhukhan, prr
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
35646
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
     1
/*
35693
5bdca98e8410 8146881: [TEST] update some imageio plugins tests to affect TIFF format
avstepan
parents: 35646
diff changeset
     2
 * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
35646
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
     4
 *
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
     7
 * published by the Free Software Foundation.
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
     8
 *
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    13
 * accompanied this code).
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    14
 *
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    18
 *
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    21
 * questions.
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    22
 */
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    23
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    24
import java.awt.Color;
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    25
import java.awt.Font;
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    26
import java.awt.Graphics2D;
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    27
import java.awt.RenderingHints;
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    28
import java.awt.geom.Rectangle2D;
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    29
import java.awt.image.BufferedImage;
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    30
import java.io.File;
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    31
import java.io.FileOutputStream;
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    32
import java.io.IOException;
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    33
import java.util.Arrays;
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    34
import java.util.HashSet;
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    35
import java.util.Iterator;
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    36
import java.util.Locale;
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    37
import java.util.Set;
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    38
import javax.imageio.IIOImage;
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    39
import javax.imageio.ImageIO;
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    40
import javax.imageio.ImageWriteParam;
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    41
import javax.imageio.ImageWriter;
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    42
import javax.imageio.stream.ImageOutputStream;
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    43
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    44
/**
49096
eaef201ec301 8198333: ProblemList should be updated for headless mode
serb
parents: 47216
diff changeset
    45
 * @test
eaef201ec301 8198333: ProblemList should be updated for headless mode
serb
parents: 47216
diff changeset
    46
 * @bug 6488522
35646
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    47
 * @summary Check the compression support in imageio ImageWriters
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    48
 * @run main ImageWriterCompressionTest
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    49
 */
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    50
public class ImageWriterCompressionTest {
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    51
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    52
    // ignore jpg (fail):
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    53
    // Caused by: javax.imageio.IIOException: Invalid argument to native writeImage
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    54
    private static final Set<String> IGNORE_FILE_SUFFIXES
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    55
        = new HashSet<String>(Arrays.asList(new String[] {
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    56
            "bmp", "gif",
35693
5bdca98e8410 8146881: [TEST] update some imageio plugins tests to affect TIFF format
avstepan
parents: 35646
diff changeset
    57
            "jpg", "jpeg"
35646
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    58
        } ));
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    59
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    60
    public static void main(String[] args) {
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    61
        Locale.setDefault(Locale.US);
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    62
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    63
        final BufferedImage image
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    64
            = new BufferedImage(512, 512, BufferedImage.TYPE_INT_ARGB);
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    65
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    66
        final Graphics2D g2d = image.createGraphics();
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    67
        try {
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    68
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    69
                                 RenderingHints.VALUE_ANTIALIAS_ON);
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    70
            g2d.setRenderingHint(RenderingHints.KEY_RENDERING,
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    71
                                 RenderingHints.VALUE_RENDER_QUALITY);
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    72
            g2d.scale(2.0, 2.0);
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    73
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    74
            g2d.setColor(Color.red);
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    75
            g2d.draw(new Rectangle2D.Float(10, 10, 100, 100));
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    76
            g2d.setColor(Color.blue);
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    77
            g2d.fill(new Rectangle2D.Float(12, 12, 98, 98));
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    78
            g2d.setColor(Color.green);
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    79
            g2d.setFont(new Font(Font.SERIF, Font.BOLD, 14));
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    80
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    81
            for (int i = 0; i < 15; i++) {
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    82
                g2d.drawString("Testing Compression ...", 20, 20 + i * 16);
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    83
            }
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    84
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    85
            final String[] fileSuffixes = ImageIO.getWriterFileSuffixes();
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    86
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    87
            final Set<String> testedWriterClasses = new HashSet<String>();
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    88
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    89
            for (String suffix : fileSuffixes) {
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    90
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    91
                if (!IGNORE_FILE_SUFFIXES.contains(suffix)) {
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    92
                    final Iterator<ImageWriter> itWriters
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    93
                        = ImageIO.getImageWritersBySuffix(suffix);
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    94
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    95
                    final ImageWriter writer;
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    96
                    final ImageWriteParam writerParams;
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    97
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    98
                    if (itWriters.hasNext()) {
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
    99
                        writer = itWriters.next();
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   100
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   101
                        if (testedWriterClasses.add(writer.getClass().getName())) {
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   102
                            writerParams = writer.getDefaultWriteParam();
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   103
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   104
                            if (writerParams.canWriteCompressed()) {
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   105
                                testCompression(image, writer, writerParams, suffix);
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   106
                            }
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   107
                        }
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   108
                    } else {
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   109
                        throw new RuntimeException("Unable to get writer !");
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   110
                    }
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   111
                }
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   112
            }
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   113
        } catch (IOException ioe) {
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   114
            throw new RuntimeException("IO failure", ioe);
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   115
        }
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   116
        finally {
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   117
            g2d.dispose();
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   118
        }
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   119
    }
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   120
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   121
    private static void testCompression(final BufferedImage image,
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   122
                                        final ImageWriter writer,
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   123
                                        final ImageWriteParam writerParams,
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   124
                                        final String suffix)
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   125
        throws IOException
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   126
    {
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   127
        System.out.println("Compression types: "
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   128
            + Arrays.toString(writerParams.getCompressionTypes()));
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   129
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   130
        // Test Compression modes:
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   131
        try {
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   132
            writerParams.setCompressionMode(ImageWriteParam.MODE_DISABLED);
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   133
            saveImage(image, writer, writerParams, "disabled", suffix);
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   134
        } catch (Exception e) {
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   135
            System.out.println("CompressionMode Disabled not supported: "+ e.getMessage());
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   136
        }
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   137
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   138
        try {
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   139
            writerParams.setCompressionMode(ImageWriteParam.MODE_DEFAULT);
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   140
            saveImage(image, writer, writerParams, "default", suffix);
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   141
        } catch (Exception e) {
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   142
            System.out.println("CompressionMode Default not supported: "+ e.getMessage());
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   143
        }
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   144
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   145
        writerParams.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   146
        writerParams.setCompressionType(selectCompressionType(suffix,
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   147
                        writerParams.getCompressionTypes()));
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   148
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   149
        System.out.println("Selected Compression type: "
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   150
            + writerParams.getCompressionType());
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   151
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   152
        long prev = Long.MAX_VALUE;
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   153
        for (int i = 10; i >= 0; i--) {
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   154
            float quality = 0.1f * i;
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   155
            writerParams.setCompressionQuality(quality);
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   156
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   157
            long len = saveImage(image, writer, writerParams,
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   158
                                 String.format("explicit-%.1f", quality), suffix);
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   159
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   160
            if (len <= 0) {
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   161
                throw new RuntimeException("zero file length !");
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   162
            } else if (len > prev) {
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   163
                throw new RuntimeException("Incorrect file length: " + len
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   164
                    + " larger than previous: " + prev + " !");
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   165
            }
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   166
            prev = len;
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   167
        }
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   168
    }
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   169
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   170
    private static String selectCompressionType(final String suffix,
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   171
                                                final String[] types)
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   172
    {
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   173
        switch (suffix) {
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   174
            case "tif":
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   175
            case "tiff":
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   176
                return "LZW";
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   177
            default:
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   178
                return types[0];
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   179
        }
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   180
    }
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   181
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   182
    private static long saveImage(final BufferedImage image,
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   183
                                  final ImageWriter writer,
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   184
                                  final ImageWriteParam writerParams,
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   185
                                  final String mode,
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   186
                                  final String suffix) throws IOException
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   187
    {
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   188
        final File imgFile = new File("WriterCompressionTest-"
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   189
                                      + mode + '.' + suffix);
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   190
        System.out.println("Writing file: " + imgFile.getAbsolutePath());
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   191
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   192
        final ImageOutputStream imgOutStream
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   193
            = ImageIO.createImageOutputStream(new FileOutputStream(imgFile));
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   194
        try {
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   195
            writer.setOutput(imgOutStream);
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   196
            writer.write(null, new IIOImage(image, null, null), writerParams);
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   197
        } finally {
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   198
            imgOutStream.close();
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   199
        }
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   200
        return imgFile.length();
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   201
    }
845a3ebfeb00 6488522: PNG writer should permit setting compression level and iDAT chunk maximum size
prr
parents:
diff changeset
   202
}