package com.akjava.gwt.lib.client.experimental.lbp;
import com.akjava.lib.common.utils.ColorUtils;
import com.google.common.base.Converter;
import com.google.common.base.Function;
import com.google.gwt.canvas.dom.client.Context2d;
import com.google.gwt.canvas.dom.client.ImageData;
public class ByteImageDataIntConverter extends Converter<ImageData,int[][]>{
private boolean color=true;
private Context2d context2d;
public ByteImageDataIntConverter(Context2d context,boolean imageIsColor){
this.context2d=context;
this.color=imageIsColor;
}
@Override
protected int[][] doForward(ImageData data) {
int[][] bytes=new int[data.getWidth()][data.getHeight()];
for(int x=0;x<data.getWidth();x++){
for(int y=0;y<data.getHeight();y++){
int value=0;
if(color){
//value=(int) (0.299*data.getRedAt(x, y) + 0.587*data.getGreenAt(x, y) + 0.114*data.getBlueAt(x, y));
value=ColorUtils.toColor(data.getRedAt(x, y), data.getGreenAt(x, y), data.getBlueAt(x, y));
}else{
throw new RuntimeException("not support yet");
//value=data.getRedAt(x, y);//from grayscale imagedata
}
bytes[x][y]=value;
}
}
return bytes;
}
@Override
protected ImageData doBackward(int[][] b) {
ImageData data=context2d.createImageData(b.length, b[0].length);
for(int x=0;x<data.getWidth();x++){
for(int y=0;y<data.getHeight();y++){
if(b[x][y]<0){
//LogUtils.log("not zero value:"+b[x][y]);
}
if(b[x][y]!=0){
// LogUtils.log("not zero value:"+b[x][y]);
}
int value=(int)b[x][y];
value=Math.min(255, value);//somehow range is 1-16
data.setAlphaAt(255, x, y);
data.setRedAt(value, x, y);
data.setGreenAt(value, x, y);
data.setBlueAt(value, x, y);
}
}
return data;
}
public static class ImageDataToByteFunction implements Function<ImageData,int[][]>{
private boolean color;
public ImageDataToByteFunction(boolean color) {
super();
this.color = color;
}
/**
* return [y][w] pixels
*/
@Override
public int[][] apply(ImageData data) {
int[][] bytes=new int[data.getHeight()][data.getWidth()];
for(int x=0;x<data.getWidth();x++){
for(int y=0;y<data.getHeight();y++){
int value=0;
if(color){
//value=(int) (0.299*data.getRedAt(x, y) + 0.587*data.getGreenAt(x, y) + 0.114*data.getBlueAt(x, y));
value=ColorUtils.toColor(data.getRedAt(x, y), data.getGreenAt(x, y), data.getBlueAt(x, y));
}else{
//throw new RuntimeException("not support yet");
value=data.getRedAt(x, y);//from grayscale imagedata
}
//bytes[x][y]=value;
bytes[y][x]=value;
}
}
return bytes;
}
}
}