diff --git a/src/main/java/azgracompress/compression/SQImageCompressor.java b/src/main/java/azgracompress/compression/SQImageCompressor.java
index a87de9be067f0552dde8bb7387d073e77d40f6de..c9ce9d893efe93cc5809e3ed7b6d1af651e5c83e 100644
--- a/src/main/java/azgracompress/compression/SQImageCompressor.java
+++ b/src/main/java/azgracompress/compression/SQImageCompressor.java
@@ -15,7 +15,6 @@ public class SQImageCompressor extends CompressorDecompressorBase implements IIm
public SQImageCompressor(ParsedCliOptions options) {
super(options);
-
}
/**
@@ -43,6 +42,9 @@ public class SQImageCompressor extends CompressorDecompressorBase implements IIm
for (final int quantizationValue : centroids) {
compressStream.writeShort(quantizationValue);
}
+ if (options.isVerbose()) {
+ Log("Wrote quantization values to compressed stream.");
+ }
}
/**
@@ -58,34 +60,36 @@ public class SQImageCompressor extends CompressorDecompressorBase implements IIm
options.getImageDimension(),
options.getReferencePlaneIndex());
- Log("Creating codebook from reference plane...");
+ Log(String.format("Training scalar quantizer from reference plane %d.", options.getReferencePlaneIndex()));
quantizer = trainScalarQuantizerFromData(referencePlane.getData());
writeCodebookToOutputStream(quantizer, compressStream);
- Log("Wrote reference codebook.");
}
final int[] planeIndices = getPlaneIndicesForCompression();
for (final int planeIndex : planeIndices) {
- Log(String.format("Loading plane %d...", planeIndex));
+ Log(String.format("Loading plane %d.", planeIndex));
final ImageU16 plane = RawDataIO.loadImageU16(options.getInputFile(),
options.getImageDimension(),
planeIndex);
if (!options.hasReferencePlaneIndex()) {
- Log("Creating plane codebook...");
+ Log(String.format("Training scalar quantizer from plane %d.", planeIndex));
quantizer = trainScalarQuantizerFromData(plane.getData());
writeCodebookToOutputStream(quantizer, compressStream);
- Log("Wrote plane codebook.");
}
assert (quantizer != null);
- Log("Writing quantization indices...");
+ Log("Compressing plane...");
final int[] indices = quantizer.quantizeIntoIndices(plane.getData());
- OutBitStream outBitStream = new OutBitStream(compressStream, options.getBitsPerPixel(), 2048);
- outBitStream.write(indices);
- outBitStream.flush();
+
+ try (OutBitStream outBitStream = new OutBitStream(compressStream, options.getBitsPerPixel(), 2048)) {
+ outBitStream.write(indices);
+ } catch (IOException ioEx) {
+ ioEx.printStackTrace();
+ }
+
Log(String.format("Finished processing of plane %d", planeIndex));
}
}
diff --git a/src/main/java/azgracompress/compression/VQImageCompressor.java b/src/main/java/azgracompress/compression/VQImageCompressor.java
index c6a3473516bb378f4efdf8b88b57733d23e18a17..3dc907798849cddf41bac69fe62b203beadc9e82 100644
--- a/src/main/java/azgracompress/compression/VQImageCompressor.java
+++ b/src/main/java/azgracompress/compression/VQImageCompressor.java
@@ -66,6 +66,9 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm
compressStream.writeShort(vecVal);
}
}
+ if (options.isVerbose()) {
+ Log("Wrote quantization vectors to compressed stream.");
+ }
}
/**
@@ -81,7 +84,7 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm
options.getImageDimension(),
options.getReferencePlaneIndex());
- Log("Creating codebook from reference plane...");
+ Log(String.format("Training vector quantizer from reference plane %d.", options.getReferencePlaneIndex()));
final int[][] refPlaneVectors = getPlaneVectors(referencePlane);
quantizer = trainVectorQuantizerFromPlaneVectors(refPlaneVectors);
writeQuantizerToCompressStream(quantizer, compressStream);
@@ -91,7 +94,7 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm
final int[] planeIndices = getPlaneIndicesForCompression();
for (final int planeIndex : planeIndices) {
- Log(String.format("Loading plane %d...", planeIndex));
+ Log(String.format("Loading plane %d.", planeIndex));
final ImageU16 plane = RawDataIO.loadImageU16(options.getInputFile(),
options.getImageDimension(),
planeIndex);
@@ -99,7 +102,7 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm
final int[][] planeVectors = getPlaneVectors(plane);
if (!options.hasReferencePlaneIndex()) {
- Log("Creating plane codebook...");
+ Log(String.format("Training vector quantizer from plane %d.", planeIndex));
quantizer = trainVectorQuantizerFromPlaneVectors(planeVectors);
writeQuantizerToCompressStream(quantizer, compressStream);
Log("Wrote plane codebook.");
@@ -107,13 +110,19 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm
assert (quantizer != null);
- Log("Writing quantization indices...");
+ Log("Compression plane...");
final int[] indices = quantizer.quantizeIntoIndices(planeVectors);
- OutBitStream outBitStream = new OutBitStream(compressStream, options.getBitsPerPixel(), 2048);
- outBitStream.write(indices);
- outBitStream.flush();
- Log(String.format("Finished processing of plane %d", planeIndex));
+ try (OutBitStream outBitStream = new OutBitStream(compressStream, options.getBitsPerPixel(), 2048)) {
+ outBitStream.write(indices);
+ } catch (IOException ioEx) {
+ ioEx.printStackTrace();
+ }
+ Log(String.format("Finished processing of plane %d.", planeIndex));
+ // OutBitStream outBitStream = new OutBitStream(compressStream, options.getBitsPerPixel(), 2048);
+ // outBitStream.write(indices);
+ // outBitStream.flush();
+ // Log(String.format("Finished processing of plane %d.", planeIndex));
}
}
diff --git a/src/main/java/azgracompress/io/OutBitStream.java b/src/main/java/azgracompress/io/OutBitStream.java
index 349c876da9ff261da77f327b4e57bd24ebc5816f..e691f5d1831fcde784a9b4ced496b23439184ed7 100644
--- a/src/main/java/azgracompress/io/OutBitStream.java
+++ b/src/main/java/azgracompress/io/OutBitStream.java
@@ -3,7 +3,7 @@ package azgracompress.io;
import java.io.IOException;
import java.io.OutputStream;
-public class OutBitStream {
+public class OutBitStream implements AutoCloseable {
private OutputStream outStream;
private byte[] buffer;
@@ -103,4 +103,14 @@ public class OutBitStream {
write(value);
}
}
+
+ /**
+ * Flush the bitsteam on close.
+ * @throws Exception when flush fails.
+ */
+ @Override
+ public void close() throws Exception {
+ flush();
+ System.out.println("Autoclosing OutBitStream");
+ }
}