Skip to content
Snippets Groups Projects
Commit b2c7bb0f authored by Vojtech Moravec's avatar Vojtech Moravec
Browse files

Compressed file format preparation.

parent 34ae9aa4
No related branches found
No related tags found
No related merge requests found
File added
import cli.CliConstants;
import cli.ParsedCliOptions;
import compression.io.OutMemoryBitStream;
import org.apache.commons.cli.*;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
......@@ -9,23 +11,63 @@ public class DataCompressor {
public static void main(String[] args) throws IOException {
/*
* Example of usage:
* ijava -ea -jar DataCompressor.jar -c -sq input.raw 1000x1000x500
* ijava -ea -jar DataCompressor.jar -c -sq -b 7 input.raw 1000x1000x500
* ijava -ea -jar DataCompressor.jar -c -sq -b 7 input.raw 1000x1000x500 10
* ijava -ea -jar DataCompressor.jar -c -sq -b 7 -rp 10 input.raw 1000x1000x500 10
* ijava -ea -jar DataCompressor.jar -c -sq -b 7 -rp 15 input.raw 1000x1000x500 10
* ijava -ea -jar DataCompressor.jar -c -sq -b 7 -rp 40 input.raw 1000x1000x500
* ijava -ea -jar DataCompressor.jar -c -vq 9 input.raw 1000x1000x500
* ijava -ea -jar DataCompressor.jar -c -vq 9x1 input.raw 1000x1000x500
* ijava -ea -jar DataCompressor.jar -c -vq 3x3 input.raw 1000x1000x500
*
* */
// TODO(Moravec): We have created nice API for single files, but ...
// we are dealing with tiffs or RAW files, which means
// that we have to pass image dimensions and plane index.
OutMemoryBitStream bitStream = new OutMemoryBitStream(null, 3, 64);
bitStream.write(0);
bitStream.write(1);
bitStream.write(2);
bitStream.write(3);
bitStream.write(4);
bitStream.write(5);
bitStream.write(6);
bitStream.write(7);
bitStream.forceFlush();
Options options = getOptions();
HelpFormatter formatter = new HelpFormatter();
CommandLineParser parser = new DefaultParser();
CommandLine cmd;
try {
cmd = parser.parse(options, args);
} catch (ParseException e) {
if ((args.length > 0) && (args[0].equals("-h") || args[0].equals("--help"))) {
formatter.printHelp("ijava -jar DataCompressor.jar", options);
return;
}
System.err.println("Error: " + e.getMessage());
return;
}
ParsedCliOptions parsedCliOptions = new ParsedCliOptions(cmd);
if (parsedCliOptions.hasErrorOccured()) {
System.err.println(parsedCliOptions.getError());
return;
}
System.out.println(parsedCliOptions.report());
switch (parsedCliOptions.getMethod()) {
case Compress:
System.out.println("Compress");
break;
case Decompress:
System.out.println("Decompress");
break;
case PrintHelp:
formatter.printHelp("ijava -jar DataCompressor.jar", options);
break;
case InspectFile:
System.err.println("Not supported yet.");
break;
}
}
@NotNull
private static Options getOptions() {
Options options = new Options();
OptionGroup methodGroup = new OptionGroup();
......@@ -68,44 +110,6 @@ public class DataCompressor {
"Reference plane index");
// options.addRequiredOption(INPUT_SHORT, INPUT_LONG, true, "Input file");
options.addOption(CliConstants.OUTPUT_SHORT, CliConstants.OUTPUT_LONG, true, "Custom output directory");
HelpFormatter formatter = new HelpFormatter();
CommandLineParser parser = new DefaultParser();
CommandLine cmd;
try {
cmd = parser.parse(options, args);
} catch (ParseException e) {
if ((args.length > 0) && (args[0].equals("-h") || args[0].equals("--help"))) {
formatter.printHelp("ijava -jar DataCompressor.jar", options);
return;
}
System.err.println("Error: " + e.getMessage());
return;
}
ParsedCliOptions parsedCliOptions = new ParsedCliOptions(cmd);
if (parsedCliOptions.hasErrorOccured()) {
System.err.println(parsedCliOptions.getError());
return;
}
System.out.println(parsedCliOptions.report());
switch (parsedCliOptions.getMethod()) {
case Compress:
System.out.println("Compress");
break;
case Decompress:
System.out.println("Decompress");
break;
case PrintHelp:
formatter.printHelp("ijava -jar DataCompressor.jar", options);
break;
case InspectFile:
System.err.println("Not supported yet.");
break;
}
return options;
}
}
package cli;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.OptionGroup;
import java.util.Iterator;
public class ImprovedOptionGroup extends OptionGroup {
private String groupName = null;
public ImprovedOptionGroup() {
}
public ImprovedOptionGroup(final String groupName) {
this.groupName = groupName;
}
@Override
public String toString() {
StringBuilder buff = new StringBuilder();
Iterator<Option> iter = this.getOptions().iterator();
buff.append("[");
while (iter.hasNext()) {
Option option = (Option) iter.next();
if (option.getOpt() != null) {
buff.append("-");
buff.append(option.getOpt());
} else {
buff.append("--");
buff.append(option.getLongOpt());
}
if (option.getDescription() != null) {
buff.append(" ");
buff.append(option.getDescription());
}
if (iter.hasNext()) {
buff.append(", ");
}
}
buff.append("]");
return buff.toString();
}
}
......@@ -2,6 +2,7 @@ package cli;
import compression.data.V2i;
import compression.data.V3i;
import compression.fileformat.QuantizationType;
import org.apache.commons.cli.CommandLine;
import java.nio.file.Paths;
......
package compression.tool;
package compression;
public class CompressorDecompressorBase {
private final String outputDirectory;
......
package compression.tool;
package compression;
public class ImageCompressor extends CompressorDecompressorBase {
public ImageCompressor(String outputDirectory, int bitsPerPixel, boolean verbose) {
......
package compression.tool;
package compression;
public class ImageDecompressor extends CompressorDecompressorBase {
public ImageDecompressor(String outputDirectory, int bitsPerPixel, boolean verbose) {
......
......@@ -3,4 +3,12 @@ package compression;
public class U16 {
public static final int Min = 0x0;
public static final int Max = 0xffff;
public static boolean isInRange(final int value) {
return ((value >= Min) && (value <= Max));
}
public static boolean isInRange(final long value) {
return ((value >= Min) && (value <= Max));
}
}
package compression.fileformat;
public class QCMPFile {
private final QCMPFileHeader header;
private final byte[] data;
public QCMPFile(QCMPFileHeader header, byte[] data) {
this.header = header;
this.data = data;
}
}
package compression.fileformat;
import compression.U16;
public class QCMPFileHeader {
public static final String QCMP_MAGIC_VALUE = "QCMPFILE";
private String magicValue;
private QuantizationType quantizationType;
private byte bitsPerPixel;
private boolean codebookPerPlane;
private int imageSizeX;
private int imageSizeY;
private int imageSizeZ;
private int vectorSizeX;
private int vectorSizeY;
private int vectorSizeZ;
/**
* Validate that all header values are in their valid range.
* @return True if this is valid QCMPFILE header.
*/
public boolean validateHeader() {
if (!magicValue.equals(QCMP_MAGIC_VALUE))
return false;
if (bitsPerPixel == 0)
return false;
if (!U16.isInRange(imageSizeX))
return false;
if (!U16.isInRange(imageSizeY))
return false;
if (!U16.isInRange(imageSizeZ))
return false;
if (!U16.isInRange(vectorSizeX))
return false;
if (!U16.isInRange(vectorSizeY))
return false;
if (!U16.isInRange(vectorSizeZ))
return false;
return true;
}
}
\ No newline at end of file
package cli;
package compression.fileformat;
public enum QuantizationType {
Scalar(0), Vector1D(1), Vector2D(2);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment