2 * Imagesqueeze - Image codec optimized for photos.
3 * Copyright (C) 2012, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of version 2 of the GNU General Public License
7 * as published by the Free Software Foundation.
10 package eu.svjatoslav.imagesqueeze.codec;
12 import eu.svjatoslav.commons.data.BitInputStream;
13 import eu.svjatoslav.commons.data.BitOutputStream;
15 import java.awt.image.BufferedImage;
19 * Main class representing compressed image.
24 public ImageMetaData metaData;
26 public BufferedImage bufferedImage;
28 private ImageEncoder encoder;
34 * Initialize imagesqueeze image based on {@link BufferedImage}.
35 * {@link BufferedImage} must be of type BufferedImage.TYPE_3BYTE_BGR .
37 public Image(final BufferedImage image) {
39 bufferedImage = image;
40 metaData = new ImageMetaData();
43 metaData.width = image.getWidth();
44 metaData.height = image.getHeight();
48 * Initialize empty imagesqueeze image.
50 public Image(final int width, final int height) {
52 bufferedImage = new BufferedImage(width, height,
53 BufferedImage.TYPE_3BYTE_BGR);
54 metaData = new ImageMetaData();
57 metaData.width = width;
58 metaData.height = height;
62 * Load ImgSqz image from {@link File}.
64 public void loadImage(final File source) throws IOException {
66 final byte[] fileContent = new byte[(int) source.length()];
68 try (FileInputStream fileInputStream = new FileInputStream(source)) {
69 if (fileInputStream.read(fileContent) != fileContent.length)
70 throw new RuntimeException("Failed to read file content");
73 final ByteArrayInputStream inputStream = new ByteArrayInputStream(
76 loadImage(inputStream);
80 * Load ImgSqz image from {@link InputStream}.
82 public void loadImage(final InputStream source) throws IOException {
83 final BitInputStream bitInputStream = new BitInputStream(source);
85 metaData = new ImageMetaData();
86 metaData.load(bitInputStream);
88 bufferedImage = new BufferedImage(metaData.width, metaData.height,
89 BufferedImage.TYPE_3BYTE_BGR);
91 final ImageDecoder imageDecoder = new ImageDecoder(this, bitInputStream);
93 imageDecoder.decode();
97 * Save image into ImgSqz file format.
99 public void saveImage(final File file) throws IOException {
100 final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
101 saveImage(outputStream);
103 final byte[] buffer = outputStream.toByteArray();
104 try (FileOutputStream fileOutputStream = new FileOutputStream(file)) {
105 fileOutputStream.write(buffer);
110 * Save image into ImgSqz file format.
112 private void saveImage(final OutputStream outputStream) throws IOException {
114 final BitOutputStream bitOutputStream = new BitOutputStream(
117 metaData.save(bitOutputStream);
119 if (encoder == null) {
120 encoder = new ImageEncoder(this);
123 encoder.encode(bitOutputStream);
125 bitOutputStream.finishByte();