public Channel scaleLinear(int new_width, int new_height) {
if (width == new_width && height == new_height) {
return this;
}
Channel channel = new Channel(new_width, new_height);
float x_coord = 0;
float y_coord = 0;
float val1 = 0;
float val2 = 0;
float height_ratio = (float)height/new_height;
float width_ratio = (float)width/new_width;
for (int y = 0; y < new_height; y++) {
y_coord = y*height_ratio - 0.5f;
int y_coord_lo = (int)y_coord;
int y_coord_hi = y_coord_lo + 1;
for (int x = 0; x < new_width; x++) {
x_coord = x*width_ratio - 0.5f;
int x_coord_lo = (int)x_coord;
int x_coord_hi = x_coord_lo + 1;
float x_diff = x_coord - x_coord_lo;
val1 = Tools.interpolateLinear(getPixelWrap(x_coord_lo, y_coord_lo),
getPixelWrap(x_coord_hi, y_coord_lo),
x_diff);
val2 = Tools.interpolateLinear(getPixelWrap(x_coord_lo, y_coord_hi),
getPixelWrap(x_coord_hi, y_coord_hi),
x_diff);
channel.putPixel(x, y, Math.Max(Math.Min(Tools.interpolateLinear(val1, val2, y_coord - y_coord_lo), 1f), 0f));
}
}
pixels = channel.getPixels();
width = new_width;
height = new_height;
return this;
}