package at.favre.tools.dconvert.converters.scaling;
import com.mortennobel.imagescaling.ResampleFilter;
import com.mortennobel.imagescaling.ResampleOp;
import java.awt.image.BufferedImage;
/**
* Wrapper for Resample Algos from Nobel's Lib
*/
public class ResampleAlgorithm implements ScaleAlgorithm {
private ResampleFilter filter;
public ResampleAlgorithm(ResampleFilter filter) {
this.filter = filter;
}
@Override
public BufferedImage scale(BufferedImage imageToScale, int dWidth, int dHeight) {
ResampleOp resizeOp = new ResampleOp(dWidth, dHeight);
resizeOp.setFilter(filter);
return resizeOp.filter(imageToScale, null);
}
public static class LanczosFilter implements ResampleFilter {
private final static float PI_FLOAT = (float) Math.PI;
private final float radius;
public LanczosFilter(float radius) {
this.radius = radius;
}
private float sincModified(float value) {
return ((float) Math.sin(value)) / value;
}
public final float apply(float value) {
if (value == 0) {
return 1.0f;
}
if (value < 0.0f) {
value = -value;
}
if (value < radius) {
value *= PI_FLOAT;
return sincModified(value) * sincModified(value / radius);
} else {
return 0.0f;
}
}
public float getSamplingRadius() {
return radius;
}
public String getName() {
return "Lanczos" + (int) radius;
}
}
@Override
public String toString() {
return "ResampleAlgorithm[" + filter.getName() + ']';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ResampleAlgorithm that = (ResampleAlgorithm) o;
return filter != null ? filter.equals(that.filter) : that.filter == null;
}
@Override
public int hashCode() {
return filter != null ? filter.hashCode() : 0;
}
}