void effectType(ByteArray* pixelArray, const Vector<float>& values) { unsigned pixelArrayLength = pixelArray->length(); for (unsigned pixelByteOffset = 0; pixelByteOffset < pixelArrayLength; pixelByteOffset += 4) { double red = pixelArray->get(pixelByteOffset); double green = pixelArray->get(pixelByteOffset + 1); double blue = pixelArray->get(pixelByteOffset + 2); double alpha = pixelArray->get(pixelByteOffset + 3); switch (filterType) { case FECOLORMATRIX_TYPE_MATRIX: matrix(red, green, blue, alpha, values); break; case FECOLORMATRIX_TYPE_SATURATE: saturate(red, green, blue, values[0]); break; case FECOLORMATRIX_TYPE_HUEROTATE: huerotate(red, green, blue, values[0]); break; case FECOLORMATRIX_TYPE_LUMINANCETOALPHA: luminance(red, green, blue, alpha); break; } pixelArray->set(pixelByteOffset, red); pixelArray->set(pixelByteOffset + 1, green); pixelArray->set(pixelByteOffset + 2, blue); pixelArray->set(pixelByteOffset + 3, alpha); } }
void effectType(const PassRefPtr<CanvasPixelArray>& srcPixelArray, PassRefPtr<ImageData>& imageData, const Vector<float>& values) { for (unsigned pixelOffset = 0; pixelOffset < srcPixelArray->length(); pixelOffset++) { unsigned pixelByteOffset = pixelOffset * 4; unsigned char r = 0, g = 0, b = 0, a = 0; srcPixelArray->get(pixelByteOffset, r); srcPixelArray->get(pixelByteOffset + 1, g); srcPixelArray->get(pixelByteOffset + 2, b); srcPixelArray->get(pixelByteOffset + 3, a); double red = r, green = g, blue = b, alpha = a; switch (filterType) { case FECOLORMATRIX_TYPE_MATRIX: matrix(red, green, blue, alpha, values); break; case FECOLORMATRIX_TYPE_SATURATE: saturate(red, green, blue, values[0]); break; case FECOLORMATRIX_TYPE_HUEROTATE: huerotate(red, green, blue, values[0]); break; case FECOLORMATRIX_TYPE_LUMINANCETOALPHA: luminance(red, green, blue, alpha); break; } imageData->data()->set(pixelByteOffset, red); imageData->data()->set(pixelByteOffset + 1, green); imageData->data()->set(pixelByteOffset + 2, blue); imageData->data()->set(pixelByteOffset + 3, alpha); } }
QImage convertImage(const QImage& image, int hue, int saturation, int brightness, int gamma) { float mat[3][3] = {{1.0,0.0,0.0},{0.0,1.0,0.0},{0.0,0.0,1.0}}; int lut[3][3][256]; QRgb c; int r,g,b,v,r2,g2,b2; float gam = 1.0/(float(gamma)/1000.0); QImage img(image); saturate(mat,saturation*0.01); huerotate(mat,(float)hue); bright(mat,brightness*0.01); for (int i = 0; i < 3; i ++) for (int j = 0; j < 3; j ++) for (int k = 0; k < 256; k ++) lut[i][j][k] = (int)(mat[i][j] * k + 0.5); img.detach(); for (int i=0;i<image.width();i++) for (int j=0;j<image.height();j++) { c = image.pixel(i,j); r = qRed(c); g = qGreen(c); b = qBlue(c); v = lut[0][0][r] + lut[1][0][g] + lut[2][0][b]; if (gamma != 1000) v = (int)rint(pow(v,gam)); if (v < 0) r2 = 0; else if (v > 255) r2 = 255; else r2 = v; v = lut[0][1][r] + lut[1][1][g] + lut[2][1][b]; if (gamma != 1000) v = (int)rint(pow(v,gam)); if (v < 0) g2 = 0; else if (v > 255) g2 = 255; else g2 = v; v = lut[0][2][r] + lut[1][2][g] + lut[2][2][b]; if (gamma != 1000) v = (int)rint(pow(v,gam)); if (v < 0) b2 = 0; else if (v > 255) b2 = 255; else b2 = v; img.setPixel(i,j,qRgb(r2,g2,b2)); } return img; }
void cupsImageRGBAdjust(cups_ib_t *pixels, /* IO - Input/output pixels */ int count, /* I - Number of pixels to adjust */ int saturation,/* I - Color saturation (%) */ int hue) /* I - Color hue (degrees) */ { int i, j, k; /* Looping vars */ float mat[3][3]; /* Color adjustment matrix */ static int last_sat = 100, /* Last saturation used */ last_hue = 0; /* Last hue used */ static cups_clut_t *lut = NULL; /* Lookup table for matrix */ if (saturation != last_sat || hue != last_hue || !lut) { /* * Build the color adjustment matrix... */ ident(mat); saturate(mat, saturation * 0.01); huerotate(mat, (float)hue); /* * Allocate memory for the lookup table... */ if (lut == NULL) lut = calloc(3, sizeof(cups_clut_t)); if (lut == NULL) return; /* * Convert the matrix into a 3x3 array of lookup tables... */ for (i = 0; i < 3; i ++) for (j = 0; j < 3; j ++) for (k = 0; k < 256; k ++) lut[i][j][k] = mat[i][j] * k + 0.5; /* * Save the saturation and hue to compare later... */ last_sat = saturation; last_hue = hue; } /* * Adjust each pixel in the given buffer. */ while (count > 0) { i = lut[0][0][pixels[0]] + lut[1][0][pixels[1]] + lut[2][0][pixels[2]]; if (i < 0) pixels[0] = 0; else if (i > 255) pixels[0] = 255; else pixels[0] = i; i = lut[0][1][pixels[0]] + lut[1][1][pixels[1]] + lut[2][1][pixels[2]]; if (i < 0) pixels[1] = 0; else if (i > 255) pixels[1] = 255; else pixels[1] = i; i = lut[0][2][pixels[0]] + lut[1][2][pixels[1]] + lut[2][2][pixels[2]]; if (i < 0) pixels[2] = 0; else if (i > 255) pixels[2] = 255; else pixels[2] = i; count --; pixels += 3; } }