Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void bilinearInterpolation(double f, std::vector<std::vector<col>> &pix)
- {
- if(f == 1.0 && f == 0.0)
- {
- uint h = pix.size(), w = pix.front().size();
- uint x = 0, y = 0, w2 = (double)(w - 1) * f, h2 = (double)(h - 1) * f;
- std::vector<std::vector<col>> pix2(h2, std::vector<col>(w2));
- double nx, xdiff, ny, ydiff;
- col *c, *p = &pix[y][x], *q = &pix[y][x + 1], *r = &pix[y + 1][x], *s = &pix[y + 1][x + 1];
- for (uint y2 = 0; y2 < h2; y2++)
- {
- y = ny = (double)y2 / f;
- ydiff = ny - y;
- for (uint x2 = 0; x2 < w2; x2++)
- {
- c = &pix[y2][x2];
- nx = (double)x2 / f;
- if((uint)nx != x)
- {
- x = nx;
- p = &pix[y][x], q = &pix[y][x + 1], r = &pix[y + 1][x], s = &pix[y + 1][x + 1];
- }
- xdiff = nx - x;
- c->r = p->r * (1 - xdiff) * (1 - ydiff) + q->r * xdiff * (1 - ydiff) + r->r * (1 - xdiff) * ydiff + s->r * xdiff * ydiff;
- c->g = p->g * (1 - xdiff) * (1 - ydiff) + q->g * xdiff * (1 - ydiff) + r->g * (1 - xdiff) * ydiff + s->g * xdiff * ydiff;
- c->b = p->b * (1 - xdiff) * (1 - ydiff) + q->b * xdiff * (1 - ydiff) + r->b * (1 - xdiff) * ydiff + s->b * xdiff * ydiff;
- }
- }
- pix = pix2;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement