diff --git a/src/main/java/azgracompress/DataCompressor.java b/src/main/java/azgracompress/DataCompressor.java index c13921e600965df0ef4ed6d8b614a47be16a5c61..c9aefe240e57b043a161dca0d277a3a44305919a 100644 --- a/src/main/java/azgracompress/DataCompressor.java +++ b/src/main/java/azgracompress/DataCompressor.java @@ -30,7 +30,7 @@ public class DataCompressor { } ParsedCliOptions parsedCliOptions = new ParsedCliOptions(cmd); - if (parsedCliOptions.hasErrorOccured()) { + if (parsedCliOptions.didErrorOccure()) { System.err.println(parsedCliOptions.getError()); return; } diff --git a/src/main/java/azgracompress/benchmark/BenchmarkBase.java b/src/main/java/azgracompress/benchmark/BenchmarkBase.java index 3a2e4378bfd767d24702f646266665136321d1d6..8e20bd7f21a9ced52e7a190fb169f937a4860d1d 100644 --- a/src/main/java/azgracompress/benchmark/BenchmarkBase.java +++ b/src/main/java/azgracompress/benchmark/BenchmarkBase.java @@ -1,5 +1,6 @@ package azgracompress.benchmark; +import azgracompress.cli.InputFileInfo; import azgracompress.cli.ParsedCliOptions; import azgracompress.data.ImageU16; import azgracompress.data.V3i; @@ -53,18 +54,19 @@ abstract class BenchmarkBase { } protected BenchmarkBase(final ParsedCliOptions options) { - this.inputFile = options.getInputFile(); + final InputFileInfo ifi = options.getInputFileInfo(); + this.inputFile = ifi.getFilePath(); this.outputDirectory = options.getOutputFile(); - this.rawImageDims = options.getImageDimension(); + this.rawImageDims = ifi.getDimensions(); this.hasReferencePlane = options.hasReferencePlaneIndex(); this.referencePlaneIndex = options.getReferencePlaneIndex(); this.codebookSize = (int) Math.pow(2, options.getBitsPerPixel()); - if (options.hasPlaneIndexSet()) { - this.planes = new int[]{options.getPlaneIndex()}; - } else if (options.hasPlaneRangeSet()) { - final int from = options.getFromPlaneIndex(); - final int to = options.getToPlaneIndex(); + if (ifi.isPlaneIndexSet()) { + this.planes = new int[]{ifi.getPlaneIndex()}; + } else if (ifi.isPlaneRangeSet()) { + final int from = ifi.getPlaneRange().getX(); + final int to = ifi.getPlaneRange().getY(); final int count = to - from; this.planes = new int[count + 1]; @@ -72,7 +74,7 @@ abstract class BenchmarkBase { this.planes[i] = from + i; } } else { - final int planeCount = options.getImageDimension().getZ(); + final int planeCount = ifi.getDimensions().getZ(); this.planes = new int[planeCount]; for (int i = 0; i < planeCount; i++) { this.planes[i] = i; diff --git a/src/main/java/azgracompress/cli/InputFileInfo.java b/src/main/java/azgracompress/cli/InputFileInfo.java index 87813cd6a2c7ca2bc4b60cfb171177449dc10369..318ca88f322bae7040d55d428bf3306ee7c49b64 100644 --- a/src/main/java/azgracompress/cli/InputFileInfo.java +++ b/src/main/java/azgracompress/cli/InputFileInfo.java @@ -30,23 +30,32 @@ public class InputFileInfo { this.filePath = filePath; } - public void setDimension(V3i dimension) { - this.dimension = dimension; + /** + * Get number of selected planes to be compressed. + * + * @return Number of planes for compression. + */ + public int getNumberOfPlanes() { + if (planeIndexSet) { + return 1; + } else if (planeRangeSet) { + return ((planeRange.getY() + 1) - planeRange.getX()); + } else { + return dimension.getZ(); + } } - public void setPlaneIndexSet(boolean planeIndexSet) { - this.planeIndexSet = planeIndexSet; + public void setDimension(final V3i dimension) { + this.dimension = dimension; } - public void setPlaneIndex(int planeIndex) { + public void setPlaneIndex(final int planeIndex) { + this.planeIndexSet = true; this.planeIndex = planeIndex; } - public void setPlaneRangeSet(boolean planeRangeSet) { - this.planeRangeSet = planeRangeSet; - } - - public void setPlaneRange(V2i planeRange) { + public void setPlaneRange(final V2i planeRange) { + this.planeRangeSet = true; this.planeRange = planeRange; } @@ -58,7 +67,7 @@ public class InputFileInfo { return filePath; } - public V3i getDimension() { + public V3i getDimensions() { return dimension; } diff --git a/src/main/java/azgracompress/cli/ParsedCliOptions.java b/src/main/java/azgracompress/cli/ParsedCliOptions.java index d6676a0fdc42e973472658c791f339c132846c4e..e72e7450fe03c18bc9f3f144218e238abf6e50b2 100644 --- a/src/main/java/azgracompress/cli/ParsedCliOptions.java +++ b/src/main/java/azgracompress/cli/ParsedCliOptions.java @@ -4,6 +4,7 @@ import azgracompress.compression.CompressorDecompressorBase; import azgracompress.data.V2i; import azgracompress.data.V3i; import azgracompress.fileformat.FileExtensions; +import azgracompress.fileformat.FileType; import azgracompress.fileformat.QuantizationType; import org.apache.commons.cli.CommandLine; import org.apache.commons.io.FilenameUtils; @@ -18,16 +19,14 @@ public class ParsedCliOptions { private ProgramMethod method; private QuantizationType quantizationType; - private String inputFile; + private InputFileInfo inputFileInfo; + private String outputFile; private String codebookCacheFolder = null; private int bitsPerPixel; private V2i vectorDimension = new V2i(0); - private V3i imageDimension = new V3i(0); - private boolean planeIndexSet = false; - private int planeIndex; private boolean refPlaneIndexSet = false; private int referencePlaneIndex = -1; @@ -37,10 +36,6 @@ public class ParsedCliOptions { private boolean errorOccurred; private String error; - private boolean planeRangeSet = false; - private int fromPlaneIndex; - private int toPlaneIndex; - private int workerCount = 1; public ParsedCliOptions(CommandLine cmdInput) { @@ -116,12 +111,37 @@ public class ParsedCliOptions { codebookCacheFolder = cmd.getOptionValue(CliConstants.CODEBOOK_CACHE_FOLDER_LONG, null); if (!errorOccurred) { - outputFile = cmd.getOptionValue(CliConstants.OUTPUT_LONG, getDefaultOutputFilePath(inputFile)); + outputFile = cmd.getOptionValue(CliConstants.OUTPUT_LONG, + getDefaultOutputFilePath(inputFileInfo.getFilePath())); } error = errorBuilder.toString(); } + /** + * Get file type from file extension. + * + * @param path File path. + * @return File type. + */ + private FileType getFileType(final String path) { + final String extension = FilenameUtils.getExtension(path).toLowerCase(); + switch (extension) { + case FileExtensions.RAW: { + return FileType.RAW; + } + case FileExtensions.TIFF: { + return FileType.TIFF; + } + case FileExtensions.QCMP: { + return FileType.QCMP; + } + default: { + return FileType.Unsupported; + } + } + } + private void parseInputFilePart(StringBuilder errorBuilder, final String[] inputFileArguments) { if (inputFileArguments.length < 1) { @@ -130,32 +150,27 @@ public class ParsedCliOptions { return; } - inputFile = inputFileArguments[0]; + inputFileInfo = new InputFileInfo(getFileType(inputFileArguments[0]), inputFileArguments[0]); // Decompress and Inspect methods doesn't require additional file information. if ((method == ProgramMethod.Decompress) || (method == ProgramMethod.InspectFile)) { return; } - File inputFileInfo = new File(inputFile); - // Check if input file exists. - if (!inputFileInfo.exists()) { + if (!new File(inputFileInfo.getFilePath()).exists()) { errorOccurred = true; errorBuilder.append("Input file doesn't exist.\n"); return; } - final String extension = FilenameUtils.getExtension(inputFile).toLowerCase(); - switch (extension) { - case FileExtensions.RAW: { + switch (inputFileInfo.getFileType()) { + case RAW: parseRawFileArguments(errorBuilder, inputFileArguments); - } - break; - case FileExtensions.TIFF: { + break; + case TIFF: parseTiffFileArguments(errorBuilder, inputFileArguments); - } - break; + break; default: { errorOccurred = true; errorBuilder.append("Unsupported input file type. Currently supporting RAW and TIFF files.\n"); @@ -208,9 +223,7 @@ public class ParsedCliOptions { final ParseResult<Integer> indexToResult = tryParseInt(toIndexString); if (indexFromResult.isSuccess() && indexToResult.isSuccess()) { - fromPlaneIndex = indexFromResult.getValue(); - toPlaneIndex = indexToResult.getValue(); - planeRangeSet = true; + inputFileInfo.setPlaneRange(new V2i(indexFromResult.getValue(), indexToResult.getValue())); } else { errorOccurred = true; errorBuilder.append("Plane range index is wrong. Expected format D-D, got: ").append( @@ -220,8 +233,7 @@ public class ParsedCliOptions { // Here we parse single plane index option. final ParseResult<Integer> parseResult = tryParseInt(inputFileArguments[inputFileArgumentsOffset]); if (parseResult.isSuccess()) { - planeIndexSet = true; - planeIndex = parseResult.getValue(); + inputFileInfo.setPlaneIndex(parseResult.getValue()); } else { errorOccurred = true; errorBuilder.append("Failed to parse plane index option, expected integer, got: ") @@ -254,7 +266,7 @@ public class ParsedCliOptions { final ParseResult<Integer> n1Result = tryParseInt(num1String); final ParseResult<Integer> n2Result = tryParseInt(secondPart); if (n1Result.isSuccess() && n2Result.isSuccess()) { - imageDimension = new V3i(n1Result.getValue(), n2Result.getValue(), 1); + inputFileInfo.setDimension(new V3i(n1Result.getValue(), n2Result.getValue(), 1)); } else { errorOccurred = true; errorBuilder.append("Failed to parse image dimensions of format DxD, got: "); @@ -269,7 +281,7 @@ public class ParsedCliOptions { final ParseResult<Integer> n3Result = tryParseInt(num3String); if (n1Result.isSuccess() && n2Result.isSuccess() && n3Result.isSuccess()) { - imageDimension = new V3i(n1Result.getValue(), n2Result.getValue(), n3Result.getValue()); + inputFileInfo.setDimension(new V3i(n1Result.getValue(), n2Result.getValue(), n3Result.getValue())); } else { errorOccurred = true; errorBuilder.append("Failed to parse image dimensions of format DxDxD, got: "); @@ -410,8 +422,8 @@ public class ParsedCliOptions { return quantizationType; } - public String getInputFile() { - return inputFile; + public InputFileInfo getInputFileInfo() { + return inputFileInfo; } public String getOutputFile() { @@ -426,14 +438,6 @@ public class ParsedCliOptions { return vectorDimension; } - public V3i getImageDimension() { - return imageDimension; - } - - public int getPlaneIndex() { - return planeIndex; - } - public int getReferencePlaneIndex() { return referencePlaneIndex; } @@ -446,11 +450,7 @@ public class ParsedCliOptions { return refPlaneIndexSet; } - public boolean hasPlaneIndexSet() { - return planeIndexSet; - } - - public boolean hasErrorOccured() { + public boolean didErrorOccure() { return errorOccurred; } @@ -458,18 +458,6 @@ public class ParsedCliOptions { return error; } - public boolean hasPlaneRangeSet() { - return planeRangeSet; - } - - public int getFromPlaneIndex() { - return fromPlaneIndex; - } - - public int getToPlaneIndex() { - return toPlaneIndex; - } - public int getWorkerCount() { return workerCount; } @@ -520,24 +508,24 @@ public class ParsedCliOptions { sb.append("BitsPerPixel: ").append(bitsPerPixel).append('\n'); sb.append("Output: ").append(outputFile).append('\n'); - sb.append("InputFile: ").append(inputFile).append('\n'); + sb.append("InputFile: ").append(inputFileInfo.getFilePath()).append('\n'); if (hasCodebookCacheFolder()) { sb.append("CodebookCacheFolder: ").append(codebookCacheFolder).append('\n'); } if (hasQuantizationType(method)) { - sb.append("Input image dims: ").append(imageDimension.toString()).append('\n'); + sb.append("Input image dims: ").append(inputFileInfo.getDimensions().toString()).append('\n'); } - if (planeIndexSet) { - sb.append("PlaneIndex: ").append(planeIndex).append('\n'); + if (inputFileInfo.isPlaneIndexSet()) { + sb.append("PlaneIndex: ").append(inputFileInfo.getPlaneIndex()).append('\n'); } if (refPlaneIndexSet) { sb.append("ReferencePlaneIndex: ").append(referencePlaneIndex).append('\n'); } - if (planeRangeSet) { - sb.append("FromPlaneIndex: ").append(fromPlaneIndex).append('\n'); - sb.append("ToPlaneIndex: ").append(toPlaneIndex).append('\n'); + if (inputFileInfo.isPlaneRangeSet()) { + sb.append("FromPlaneIndex: ").append(inputFileInfo.getPlaneRange().getX()).append('\n'); + sb.append("ToPlaneIndex: ").append(inputFileInfo.getPlaneRange().getY()).append('\n'); } sb.append("Verbose: ").append(verbose).append('\n'); @@ -546,18 +534,5 @@ public class ParsedCliOptions { return sb.toString(); } - /** - * Get number of planes to be compressed. - * - * @return Number of planes for compression. - */ - public int getNumberOfPlanes() { - if (hasPlaneIndexSet()) { - return 1; - } else if (hasPlaneRangeSet()) { - return ((toPlaneIndex + 1) - fromPlaneIndex); - } else { - return imageDimension.getZ(); - } - } + } diff --git a/src/main/java/azgracompress/compression/CompressorDecompressorBase.java b/src/main/java/azgracompress/compression/CompressorDecompressorBase.java index 1b369aaac2c4007829c8abc616a9a11c373bb99c..07e24ec4c37c6f7662bb34dcea90d0d837ae6fb1 100644 --- a/src/main/java/azgracompress/compression/CompressorDecompressorBase.java +++ b/src/main/java/azgracompress/compression/CompressorDecompressorBase.java @@ -1,5 +1,6 @@ package azgracompress.compression; +import azgracompress.cli.InputFileInfo; import azgracompress.cli.ParsedCliOptions; public abstract class CompressorDecompressorBase { @@ -14,11 +15,12 @@ public abstract class CompressorDecompressorBase { } protected int[] getPlaneIndicesForCompression() { - if (options.hasPlaneIndexSet()) { - return new int[]{options.getPlaneIndex()}; - } else if (options.hasPlaneRangeSet()) { - final int from = options.getFromPlaneIndex(); - final int to = options.getToPlaneIndex(); + final InputFileInfo ifi = options.getInputFileInfo(); + if (ifi.isPlaneIndexSet()) { + return new int[]{ifi.getPlaneIndex()}; + } else if (ifi.isPlaneRangeSet()) { + final int from = ifi.getPlaneRange().getX(); + final int to = ifi.getPlaneRange().getY(); final int count = to - from; int[] indices = new int[count + 1]; @@ -27,7 +29,7 @@ public abstract class CompressorDecompressorBase { } return indices; } else { - return generateAllPlaneIndices(options.getImageDimension().getZ()); + return generateAllPlaneIndices(ifi.getDimensions().getZ()); } } diff --git a/src/main/java/azgracompress/compression/ImageCompressor.java b/src/main/java/azgracompress/compression/ImageCompressor.java index 0239a1b3488f9e9fa88f6c251bc0424be5d640ed..9ec22d8d3f87d3a908c2df7450154998eab4a315 100644 --- a/src/main/java/azgracompress/compression/ImageCompressor.java +++ b/src/main/java/azgracompress/compression/ImageCompressor.java @@ -106,9 +106,9 @@ public class ImageCompressor extends CompressorDecompressorBase { final boolean oneCodebook = options.hasReferencePlaneIndex() || options.hasCodebookCacheFolder(); header.setCodebookPerPlane(!oneCodebook); - header.setImageSizeX(options.getImageDimension().getX()); - header.setImageSizeY(options.getImageDimension().getY()); - header.setImageSizeZ(options.getNumberOfPlanes()); + header.setImageSizeX(options.getInputFileInfo().getDimensions().getX()); + header.setImageSizeY(options.getInputFileInfo().getDimensions().getY()); + header.setImageSizeZ(options.getInputFileInfo().getNumberOfPlanes()); header.setVectorDimension(options.getVectorDimension()); diff --git a/src/main/java/azgracompress/compression/ImageDecompressor.java b/src/main/java/azgracompress/compression/ImageDecompressor.java index 40ac32bc89ba20039ec779cde30df82b7db7b045..b2e4cdbb052831bf829c28843e5cb6a02a3bf322 100644 --- a/src/main/java/azgracompress/compression/ImageDecompressor.java +++ b/src/main/java/azgracompress/compression/ImageDecompressor.java @@ -60,7 +60,7 @@ public class ImageDecompressor extends CompressorDecompressorBase { boolean validFile = true; QCMPFileHeader header = null; - try (FileInputStream fileInputStream = new FileInputStream(options.getInputFile()); + try (FileInputStream fileInputStream = new FileInputStream(options.getInputFileInfo().getFilePath()); DataInputStream dataInputStream = new DataInputStream(fileInputStream)) { header = readQCMPFileHeader(dataInputStream); } catch (IOException ioEx) { @@ -108,7 +108,7 @@ public class ImageDecompressor extends CompressorDecompressorBase { logBuilder.append("Vector size Y:\t\t").append(header.getVectorSizeY()).append('\n'); logBuilder.append("Vector size Z:\t\t").append(header.getVectorSizeZ()).append('\n'); - final long fileSize = new File(options.getInputFile()).length(); + final long fileSize = new File(options.getInputFileInfo().getFilePath()).length(); final long dataSize = fileSize - QCMPFileHeader.QCMP_HEADER_SIZE; final IImageDecompressor decompressor = getImageDecompressor(header); if (decompressor != null) { @@ -128,7 +128,7 @@ public class ImageDecompressor extends CompressorDecompressorBase { public boolean decompress() { - try (FileInputStream fileInputStream = new FileInputStream(options.getInputFile()); + try (FileInputStream fileInputStream = new FileInputStream(options.getInputFileInfo().getFilePath()); DataInputStream dataInputStream = new DataInputStream(fileInputStream)) { final QCMPFileHeader header = readQCMPFileHeader(dataInputStream); @@ -148,7 +148,7 @@ public class ImageDecompressor extends CompressorDecompressorBase { return false; } - final long fileSize = new File(options.getInputFile()).length(); + final long fileSize = new File(options.getInputFileInfo().getFilePath()).length(); final long dataSize = fileSize - QCMPFileHeader.QCMP_HEADER_SIZE; final long expectedDataSize = imageDecompressor.getExpectedDataSize(header); if (dataSize != expectedDataSize) { diff --git a/src/main/java/azgracompress/compression/SQImageCompressor.java b/src/main/java/azgracompress/compression/SQImageCompressor.java index 150a57346c604b660134afeecd1e3a85b988fcb6..5a9e8684ed8a811bbde675f6404aa9663fbebea8 100644 --- a/src/main/java/azgracompress/compression/SQImageCompressor.java +++ b/src/main/java/azgracompress/compression/SQImageCompressor.java @@ -1,6 +1,7 @@ package azgracompress.compression; import azgracompress.U16; +import azgracompress.cli.InputFileInfo; import azgracompress.cli.ParsedCliOptions; import azgracompress.compression.exception.ImageCompressionException; import azgracompress.data.ImageU16; @@ -65,7 +66,8 @@ public class SQImageCompressor extends CompressorDecompressorBase implements IIm private ScalarQuantizer loadQuantizerFromCache() throws ImageCompressionException { QuantizationValueCache cache = new QuantizationValueCache(options.getCodebookCacheFolder()); try { - final int[] quantizationValues = cache.readCachedValues(options.getInputFile(), codebookSize); + final int[] quantizationValues = cache.readCachedValues(options.getInputFileInfo().getFilePath(), + codebookSize); return new ScalarQuantizer(U16.Min, U16.Max, quantizationValues); } catch (IOException e) { throw new ImageCompressionException("Failed to read quantization values from cache file.", e); @@ -79,6 +81,7 @@ public class SQImageCompressor extends CompressorDecompressorBase implements IIm * @throws ImageCompressionException When compress process fails. */ public void compress(DataOutputStream compressStream) throws ImageCompressionException { + final InputFileInfo inputFileInfo = options.getInputFileInfo(); Stopwatch stopwatch = new Stopwatch(); final boolean hasGeneralQuantizer = options.hasCodebookCacheFolder() || options.hasReferencePlaneIndex(); @@ -93,8 +96,8 @@ public class SQImageCompressor extends CompressorDecompressorBase implements IIm stopwatch.restart(); ImageU16 referencePlane = null; try { - referencePlane = RawDataIO.loadImageU16(options.getInputFile(), - options.getImageDimension(), + referencePlane = RawDataIO.loadImageU16(inputFileInfo.getFilePath(), + inputFileInfo.getDimensions(), options.getReferencePlaneIndex()); } catch (Exception ex) { throw new ImageCompressionException("Unable to load reference plane data.", ex); @@ -118,8 +121,8 @@ public class SQImageCompressor extends CompressorDecompressorBase implements IIm ImageU16 plane = null; try { - plane = RawDataIO.loadImageU16(options.getInputFile(), - options.getImageDimension(), + plane = RawDataIO.loadImageU16(inputFileInfo.getFilePath(), + inputFileInfo.getDimensions(), planeIndex); } catch (Exception ex) { throw new ImageCompressionException("Unable to load plane data.", ex); @@ -148,21 +151,22 @@ public class SQImageCompressor extends CompressorDecompressorBase implements IIm } private int[] loadConfiguredPlanesData() throws ImageCompressionException { + final InputFileInfo inputFileInfo = options.getInputFileInfo(); int[] trainData = null; - if (options.hasPlaneIndexSet()) { + if (inputFileInfo.isPlaneIndexSet()) { try { Log("Loading single plane data."); - trainData = RawDataIO.loadImageU16(options.getInputFile(), - options.getImageDimension(), - options.getPlaneIndex()).getData(); + trainData = RawDataIO.loadImageU16(inputFileInfo.getFilePath(), + inputFileInfo.getDimensions(), + inputFileInfo.getPlaneIndex()).getData(); } catch (IOException e) { throw new ImageCompressionException("Failed to load reference image data.", e); } - } else if (options.hasPlaneRangeSet()) { + } else if (inputFileInfo.isPlaneRangeSet()) { Log("Loading plane range data."); final int[] planes = getPlaneIndicesForCompression(); try { - trainData = RawDataIO.loadPlanesData(options.getInputFile(), options.getImageDimension(), planes); + trainData = RawDataIO.loadPlanesData(inputFileInfo.getFilePath(), inputFileInfo.getDimensions(), planes); } catch (IOException e) { e.printStackTrace(); throw new ImageCompressionException("Failed to load plane range data.", e); @@ -170,7 +174,7 @@ public class SQImageCompressor extends CompressorDecompressorBase implements IIm } else { Log("Loading all planes data."); try { - trainData = RawDataIO.loadAllPlanesData(options.getInputFile(), options.getImageDimension()); + trainData = RawDataIO.loadAllPlanesData(inputFileInfo.getFilePath(), inputFileInfo.getDimensions()); } catch (IOException e) { throw new ImageCompressionException("Failed to load all planes data.", e); } @@ -196,7 +200,7 @@ public class SQImageCompressor extends CompressorDecompressorBase implements IIm Log(String.format("Saving cache file to %s", options.getOutputFile())); QuantizationValueCache cache = new QuantizationValueCache(options.getOutputFile()); try { - cache.saveQuantizationValues(options.getInputFile(), qValues); + cache.saveQuantizationValues(options.getInputFileInfo().getFilePath(), qValues); } catch (IOException e) { throw new ImageCompressionException("Unable to write cache.", e); } diff --git a/src/main/java/azgracompress/compression/VQImageCompressor.java b/src/main/java/azgracompress/compression/VQImageCompressor.java index 695cd163a97122fd81733fec4f6e240919bdcf40..d4e62fed617853f85ba5605c6ad13e8dc77a9d46 100644 --- a/src/main/java/azgracompress/compression/VQImageCompressor.java +++ b/src/main/java/azgracompress/compression/VQImageCompressor.java @@ -1,5 +1,6 @@ package azgracompress.compression; +import azgracompress.cli.InputFileInfo; import azgracompress.cli.ParsedCliOptions; import azgracompress.compression.exception.ImageCompressionException; import azgracompress.data.Chunk2D; @@ -68,7 +69,7 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm private VectorQuantizer loadQuantizerFromCache() throws ImageCompressionException { QuantizationValueCache cache = new QuantizationValueCache(options.getCodebookCacheFolder()); try { - final CodebookEntry[] codebook = cache.readCachedValues(options.getInputFile(), + final CodebookEntry[] codebook = cache.readCachedValues(options.getInputFileInfo().getFilePath(), codebookSize, options.getVectorDimension().getX(), options.getVectorDimension().getY()); @@ -86,6 +87,7 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm * @throws ImageCompressionException When compress process fails. */ public void compress(DataOutputStream compressStream) throws ImageCompressionException { + final InputFileInfo inputFileInfo = options.getInputFileInfo(); Stopwatch stopwatch = new Stopwatch(); final boolean hasGeneralQuantizer = options.hasCodebookCacheFolder() || options.hasReferencePlaneIndex(); VectorQuantizer quantizer = null; @@ -100,8 +102,8 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm ImageU16 referencePlane = null; try { - referencePlane = RawDataIO.loadImageU16(options.getInputFile(), - options.getImageDimension(), + referencePlane = RawDataIO.loadImageU16(inputFileInfo.getFilePath(), + inputFileInfo.getDimensions(), options.getReferencePlaneIndex()); } catch (Exception ex) { throw new ImageCompressionException("Unable to load reference plane data.", ex); @@ -123,8 +125,8 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm ImageU16 plane = null; try { - plane = RawDataIO.loadImageU16(options.getInputFile(), - options.getImageDimension(), + plane = RawDataIO.loadImageU16(inputFileInfo.getFilePath(), + inputFileInfo.getDimensions(), planeIndex); } catch (Exception ex) { throw new ImageCompressionException("Unable to load plane data.", ex); @@ -164,8 +166,8 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm * @throws IOException When reading fails. */ private int[][] loadPlaneQuantizationVectors(final int planeIndex) throws IOException { - ImageU16 refPlane = RawDataIO.loadImageU16(options.getInputFile(), - options.getImageDimension(), + ImageU16 refPlane = RawDataIO.loadImageU16(options.getInputFileInfo().getFilePath(), + options.getInputFileInfo().getDimensions(), planeIndex); return refPlane.toQuantizationVectors(options.getVectorDimension()); @@ -173,22 +175,23 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm private int[][] loadConfiguredPlanesData() throws ImageCompressionException { final int vectorSize = options.getVectorDimension().getX() * options.getVectorDimension().getY(); + final InputFileInfo ifi = options.getInputFileInfo(); int[][] trainData = null; Stopwatch s = new Stopwatch(); s.start(); - if (options.hasPlaneIndexSet()) { + if (ifi.isPlaneIndexSet()) { Log("VQ: Loading single plane data."); try { - trainData = loadPlaneQuantizationVectors(options.getPlaneIndex()); + trainData = loadPlaneQuantizationVectors(ifi.getPlaneIndex()); } catch (IOException e) { throw new ImageCompressionException("Failed to load reference image data.", e); } } else { - Log(options.hasPlaneRangeSet() ? "VQ: Loading plane range data." : "VQ: Loading all planes data."); + Log(ifi.isPlaneRangeSet() ? "VQ: Loading plane range data." : "VQ: Loading all planes data."); final int[] planeIndices = getPlaneIndicesForCompression(); final int chunkCountPerPlane = Chunk2D.calculateRequiredChunkCountPerPlane( - options.getImageDimension().toV2i(), + ifi.getDimensions().toV2i(), options.getVectorDimension()); final int totalChunkCount = chunkCountPerPlane * planeIndices.length; @@ -227,7 +230,9 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm Log("Saving cache file to %s", options.getOutputFile()); QuantizationValueCache cache = new QuantizationValueCache(options.getOutputFile()); try { - cache.saveQuantizationValues(options.getInputFile(), lbgResult.getCodebook(), options.getVectorDimension()); + cache.saveQuantizationValues(options.getInputFileInfo().getFilePath(), + lbgResult.getCodebook(), + options.getVectorDimension()); } catch (IOException e) { throw new ImageCompressionException("Unable to write cache.", e); } diff --git a/src/main/java/azgracompress/data/V2i.java b/src/main/java/azgracompress/data/V2i.java index 498073b176ae02280fa0d035e95e7b3b2254e8d7..95c13cafba4be9e7ec90fe36c51c194b77edb5c8 100644 --- a/src/main/java/azgracompress/data/V2i.java +++ b/src/main/java/azgracompress/data/V2i.java @@ -13,9 +13,7 @@ public class V2i { this(universalValue, universalValue); } - public int getX() { - return x; - } + public int getX() { return x; } public int getY() { return y; diff --git a/src/main/java/azgracompress/fileformat/FileType.java b/src/main/java/azgracompress/fileformat/FileType.java index 98089c077cca1fb55fb2e99afc7cbb8333748d72..327c30775f52cd93b6c01abb6ecda1c0182e3557 100644 --- a/src/main/java/azgracompress/fileformat/FileType.java +++ b/src/main/java/azgracompress/fileformat/FileType.java @@ -3,5 +3,6 @@ package azgracompress.fileformat; public enum FileType { RAW, TIFF, - QCMP + QCMP, + Unsupported }