static MyColor GetApproximateColor_Bicubic(BufferReader4 reader, double cx, double cy) { //TODO: review here, //passing pointer to array or use stackalloc byte[] rBuffer = new byte[16]; byte[] gBuffer = new byte[16]; byte[] bBuffer = new byte[16]; byte[] aBuffer = new byte[16]; //nearest neighbor if (reader.CurrentX > 2 && reader.CurrentY > 2 && reader.CurrentX < reader.Width - 2 && reader.CurrentY < reader.Height - 2) { //read 4 point sample MyColor[] colors = new MyColor[16]; reader.SetStartPixel((int)cx, (int)cy); reader.Read16(colors); double x0 = (int)cx; double x1 = (int)(cx + 1); double xdiff = cx - x0; double y0 = (int)cy; double y1 = (int)(cy + 1); double ydiff = cy - y0; SeparateByChannel(colors, rBuffer, gBuffer, bBuffer, aBuffer); double result_B = myInterpolator.getValueBytes(bBuffer, xdiff, ydiff); double result_G = myInterpolator.getValueBytes(gBuffer, xdiff, ydiff); double result_R = myInterpolator.getValueBytes(rBuffer, xdiff, ydiff); double result_A = myInterpolator.getValueBytes(aBuffer, xdiff, ydiff); //clamp if (result_B > 255) { result_B = 255; } else if (result_B < 0) { result_B = 0; } if (result_G > 255) { result_G = 255; } else if (result_G < 0) { result_G = 0; } if (result_R > 255) { result_R = 255; } else if (result_R < 0) { result_R = 0; } if (result_A > 255) { result_A = 255; } else if (result_A < 0) { result_A = 0; } return(new MyColor((byte)result_R, (byte)result_G, (byte)result_B, (byte)result_A)); } else { return(reader.ReadOnePixel()); } }
static MyColor GetApproximateColor_Bicubic(BufferReader4 reader, double cx, double cy) { byte[] rBuffer = new byte[16]; byte[] gBuffer = new byte[16]; byte[] bBuffer = new byte[16]; byte[] aBuffer = new byte[16]; //nearest neighbor if (reader.CurrentX > 2 && reader.CurrentY > 2 && reader.CurrentX < reader.Width - 2 && reader.CurrentY < reader.Height - 2) { //read 4 point sample MyColor[] colors = new MyColor[16]; reader.SetStartPixel((int)cx, (int)cy); reader.Read16(colors); double x0 = (int)cx; double x1 = (int)(cx + 1); double xdiff = cx - x0; double y0 = (int)cy; double y1 = (int)(cy + 1); double ydiff = cy - y0; SeparateByChannel(colors, rBuffer, gBuffer, bBuffer, aBuffer); double result_B = myInterpolator.getValueBytes(bBuffer, xdiff, ydiff); double result_G = myInterpolator.getValueBytes(gBuffer, xdiff, ydiff); double result_R = myInterpolator.getValueBytes(rBuffer, xdiff, ydiff); double result_A = myInterpolator.getValueBytes(aBuffer, xdiff, ydiff); //clamp if (result_B > 255) { result_B = 255; } else if (result_B < 0) { result_B = 0; } if (result_G > 255) { result_G = 255; } else if (result_G < 0) { result_G = 0; } if (result_R > 255) { result_R = 255; } else if (result_R < 0) { result_R = 0; } if (result_A > 255) { result_A = 255; } else if (result_A < 0) { result_A = 0; } return new MyColor((byte)result_R, (byte)result_G, (byte)result_B, (byte)result_A); } else { return reader.ReadOnePixel(); } }