package ecologylab.serialization.types.scalar; import ecologylab.serialization.ScalarUnmarshallingContext; import ecologylab.serialization.TranslationContext; import ecologylab.serialization.types.ScalarType; public abstract class ImageType<T> extends ScalarType<T> { public ImageType(Class thatClass) { super(thatClass); } /** * get platform dependent image type T instance from string. */ @Override public abstract T getInstance(String value, String[] formatStrings, ScalarUnmarshallingContext scalarUnmarshallingContext); /** * marshall platform dependent image type T to string. */ @Override public abstract String marshall(T input, TranslationContext serializationContext); /** * convert raw image byte array to string * * @param imageRawByte * @return */ public String byteArrayToString(byte[] rawImageByteArray) { StringBuilder res = new StringBuilder(rawImageByteArray.length*2); for (int i = 0; i < rawImageByteArray.length; ++i) { int in = (rawImageByteArray[i] >= 0)?rawImageByteArray[i]:256+rawImageByteArray[i]; String x = Integer.toString(in,16); if (in < 16) res.append("0"); res.append(x); } return res.toString(); } /** * convert serialized image string to byte array * * @param serializedImageString * @return */ public byte[] stringToByteArray(String serializedImageString) { serializedImageString = serializedImageString.trim(); byte[] data = new byte[serializedImageString.length() / 2]; // TODO: optimize for (int i = 0; i < data.length; ++i) data[i] = (byte) Integer.parseInt(serializedImageString.substring(2 * i, 2 * i + 2), 16); return data; } }