public static capex.image.BitmapBuffer createForArrayFilter(capex.image.BitmapBuffer bmpbuf, double[] filterArray, int fw, int fh, double factor = 1.00, double bias = 1.00) { var srcbuf = bmpbuf.getBuffer(); var w = bmpbuf.getWidth(); var h = bmpbuf.getHeight(); if (w < 1 || h < 1) { return(null); } var desbuf = new byte[w * h * 4]; var x = 0; var y = 0; var srcptr = srcbuf; var desptr = desbuf; var sz = (int)cape.Buffer.getSize(srcbuf); for (x = 0; x < w; x++) { for (y = 0; y < h; y++) { var sr = 0.00; var sg = 0.00; var sb = 0.00; var sa = 0.00; var fx = 0; var fy = 0; for (fy = 0; fy < fh; fy++) { for (fx = 0; fx < fw; fx++) { var ix = x - fw / 2 + fx; var iy = y - fh / 2 + fy; sr += (double)(capex.image.ImageFilterUtil.getSafeByte(srcptr, sz, (iy * w + ix) * 4 + 0) * filterArray[fy * fw + fx]); sg += (double)(capex.image.ImageFilterUtil.getSafeByte(srcptr, sz, (iy * w + ix) * 4 + 1) * filterArray[fy * fw + fx]); sb += (double)(capex.image.ImageFilterUtil.getSafeByte(srcptr, sz, (iy * w + ix) * 4 + 2) * filterArray[fy * fw + fx]); sa += (double)(capex.image.ImageFilterUtil.getSafeByte(srcptr, sz, (iy * w + ix) * 4 + 3) * filterArray[fy * fw + fx]); } } cape.Buffer.setByte(desptr, (long)((y * w + x) * 4 + 0), (byte)capex.image.ImageFilterUtil.clamp(factor * sr + bias)); cape.Buffer.setByte(desptr, (long)((y * w + x) * 4 + 1), (byte)capex.image.ImageFilterUtil.clamp(factor * sg + bias)); cape.Buffer.setByte(desptr, (long)((y * w + x) * 4 + 2), (byte)capex.image.ImageFilterUtil.clamp(factor * sb + bias)); cape.Buffer.setByte(desptr, (long)((y * w + x) * 4 + 3), (byte)capex.image.ImageFilterUtil.clamp(factor * sa + bias)); } } return(capex.image.BitmapBuffer.create(desbuf, w, h)); }
public static capex.image.BitmapBuffer createGreyscale(capex.image.BitmapBuffer bmpbuf, double rf = 1.00, double gf = 1.00, double bf = 1.00, double af = 1.00) { var w = bmpbuf.getWidth(); var h = bmpbuf.getHeight(); var srcbuf = bmpbuf.getBuffer(); if (srcbuf == null || w < 1 || h < 1) { return(null); } var desbuf = new byte[w * h * 4]; if (desbuf == null) { return(null); } var ss = (int)cape.Buffer.getSize(srcbuf); var srcptr = srcbuf; var desptr = desbuf; var x = 0; var y = 0; for (y = 0; y < h; y++) { for (x = 0; x < w; x++) { var sr = (double)(capex.image.ImageFilterUtil.getSafeByte(srcptr, ss, (y * w + x) * 4 + 0) * 0.21); var sg = (double)(capex.image.ImageFilterUtil.getSafeByte(srcptr, ss, (y * w + x) * 4 + 1) * 0.72); var sb = (double)(capex.image.ImageFilterUtil.getSafeByte(srcptr, ss, (y * w + x) * 4 + 2) * 0.07); var sa = (double)capex.image.ImageFilterUtil.getSafeByte(srcptr, ss, (y * w + x) * 4 + 3); var sbnw = (int)(sr + sg + sb); cape.Buffer.setByte(desptr, (long)((y * w + x) * 4 + 0), (byte)capex.image.ImageFilterUtil.clamp((double)(sbnw * rf))); cape.Buffer.setByte(desptr, (long)((y * w + x) * 4 + 1), (byte)capex.image.ImageFilterUtil.clamp((double)(sbnw * gf))); cape.Buffer.setByte(desptr, (long)((y * w + x) * 4 + 2), (byte)capex.image.ImageFilterUtil.clamp((double)(sbnw * bf))); cape.Buffer.setByte(desptr, (long)((y * w + x) * 4 + 3), (byte)capex.image.ImageFilterUtil.clamp(sa * af)); } } return(capex.image.BitmapBuffer.create(desbuf, w, h)); }
public static capex.image.BitmapBuffer resizeBicubic(capex.image.BitmapBuffer bb, int anw, int anh) { if (anw == 0 || anh == 0) { return(null); } if (anw < 0 && anh < 0) { return(bb); } var sb = bb.getBuffer(); if (sb == null) { return(null); } var w = bb.getWidth(); var h = bb.getHeight(); var scaler = 1.00; var nw = anw; var nh = anh; if (nw < 0) { scaler = (double)nh / (double)h; } else if (nh < 0) { scaler = (double)nw / (double)w; } if (scaler != 1.00) { nw = (int)((double)w * scaler); nh = (int)((double)h * scaler); } var v = new byte[nw * nh * 4]; capex.image.ImageResizer.IndexMovingBuffer destp = null; destp.setBuf(v); var y = 0; var sx = (double)nw / (double)w; var sy = (double)nh / (double)h; var matrix = capex.util.Matrix33.forScale(sx, sy); matrix = capex.util.Matrix33.invertMatrix(matrix); var uinc = matrix.v[0]; var vinc = matrix.v[1]; var winc = matrix.v[2]; var pixels = capex.image.RGBAPixelIntegerBuffer.create(sb, w, h); var pixrgn = capex.image.PixelRegionBuffer.forRgbaPixels(pixels, 4, 4); var tu = new double[5]; var tv = new double[5]; var tw = new double[5]; var su = new double[5]; var sv = new double[5]; for (y = 0; y < nh; y++) { capex.image.ImageResizer.untransformCoords(matrix, 0, y, tu, tv, tw); var width = nw; while (width-- > 0) { var i = 0; capex.image.ImageResizer.normalizeCoords(5, tu, tv, tw, su, sv); if (capex.image.ImageResizer.superSampleDtest(su[1], sv[1], su[2], sv[2], su[3], sv[3], su[4], sv[4])) { capex.image.ImageResizer.sampleAdapt(pixels, su[0], sv[0], su[1], sv[1], su[2], sv[2], su[3], sv[3], su[4], sv[4], destp); } else { capex.image.ImageResizer.sampleCubic(pixrgn, su[0], sv[0], destp); } destp = destp.move(4); for (i = 0; i < 5; i++) { tu[i] = tu[i] + uinc; tv[i] = tv[i] + vinc; tw[i] = tw[i] + winc; } } } return(capex.image.BitmapBuffer.create(v, nw, nh)); }
public static capex.image.BitmapBuffer resizeBilinear(capex.image.BitmapBuffer bmpbuf, int anw, int anh) { if (anw == 0 || anh == 0) { return(null); } if (anw < 0 && anh < 0) { return(bmpbuf); } var src = bmpbuf.getBuffer(); if (src == null) { return(null); } var sz = (int)cape.Buffer.getSize(src); var ow = bmpbuf.getWidth(); var oh = bmpbuf.getHeight(); if (ow == anw && oh == anh) { return(bmpbuf); } if (sz != ow * oh * 4) { return(null); } var nw = anw; var nh = anh; var scaler = 1.00; if (nw < 0) { scaler = (double)nh / (double)oh; } else if (nh < 0) { scaler = (double)nw / (double)ow; } if (scaler != 1.00) { nw = (int)((double)ow * scaler); nh = (int)((double)oh * scaler); } var dest = new byte[nw * nh * 4]; if (dest == null) { return(null); } var desp = dest; var srcp = src; var dx = 0; var dy = 0; var stepx = (double)((ow - 1.00) / (nw - 1.00)); var stepy = (double)((oh - 1.00) / (nh - 1.00)); for (dy = 0; dy < nh; dy++) { for (dx = 0; dx < nw; dx++) { var ptx = (double)(dx * stepx); var pty = (double)(dy * stepy); var ix = (int)ptx; var iy = (int)pty; var q11i = (iy * ow + ix) * 4; var q21i = (iy * ow + ix + 1) * 4; var q12i = ((iy + 1) * ow + ix) * 4; var q22i = ((iy + 1) * ow + ix + 1) * 4; var rq11 = capex.image.ImageFilterUtil.getSafeByte(srcp, sz, q11i + 0); var gq11 = capex.image.ImageFilterUtil.getSafeByte(srcp, sz, q11i + 1); var bq11 = capex.image.ImageFilterUtil.getSafeByte(srcp, sz, q11i + 2); var aq11 = capex.image.ImageFilterUtil.getSafeByte(srcp, sz, q11i + 3); var rq21 = capex.image.ImageFilterUtil.getSafeByte(srcp, sz, q21i + 0); var gq21 = capex.image.ImageFilterUtil.getSafeByte(srcp, sz, q21i + 1); var bq21 = capex.image.ImageFilterUtil.getSafeByte(srcp, sz, q21i + 2); var aq21 = capex.image.ImageFilterUtil.getSafeByte(srcp, sz, q21i + 3); var rq12 = capex.image.ImageFilterUtil.getSafeByte(srcp, sz, q12i + 0); var gq12 = capex.image.ImageFilterUtil.getSafeByte(srcp, sz, q12i + 1); var bq12 = capex.image.ImageFilterUtil.getSafeByte(srcp, sz, q12i + 2); var aq12 = capex.image.ImageFilterUtil.getSafeByte(srcp, sz, q12i + 3); var rq22 = capex.image.ImageFilterUtil.getSafeByte(srcp, sz, q22i + 0); var gq22 = capex.image.ImageFilterUtil.getSafeByte(srcp, sz, q22i + 1); var bq22 = capex.image.ImageFilterUtil.getSafeByte(srcp, sz, q22i + 2); var aq22 = capex.image.ImageFilterUtil.getSafeByte(srcp, sz, q22i + 3); var resr = (int)capex.image.ImageResizer.bilinearInterpolation(rq11, rq21, rq12, rq22, ptx - ix, pty - iy); var resg = (int)capex.image.ImageResizer.bilinearInterpolation(gq11, gq21, gq12, gq22, ptx - ix, pty - iy); var resb = (int)capex.image.ImageResizer.bilinearInterpolation(bq11, bq21, bq12, bq22, ptx - ix, pty - iy); var resa = (int)capex.image.ImageResizer.bilinearInterpolation(aq11, aq21, aq12, aq22, ptx - ix, pty - iy); cape.Buffer.setByte(desp, (long)((dy * nw + dx) * 4 + 0), (byte)resr); cape.Buffer.setByte(desp, (long)((dy * nw + dx) * 4 + 1), (byte)resg); cape.Buffer.setByte(desp, (long)((dy * nw + dx) * 4 + 2), (byte)resb); cape.Buffer.setByte(desp, (long)((dy * nw + dx) * 4 + 3), (byte)resa); } } return(capex.image.BitmapBuffer.create(dest, nw, nh)); }