1

グレースケールの Java コードがこれ ( 0.2126 * 赤 + 0.7152 * 緑 + 0.0722 * 青) であることは知っています。オレンジ色を増やしたり、明るくしたり、暗くしたり...シャープにしたりなど

 int pixel = image.getRGB(j, i);
 int red = (pixel) & 0xff;
 int green = (pixel >> 8) & 0xff;
 int blue = (pixel >> 16) & 0xff;
 int newPixel = (int) (0.2126 * red  + 0.7152 * green + 0.0722 * blue);
                    image1.setRGB(j, i, newPixel);
4

3 に答える 3

3

あなたが言及する昔ながらの方法は、「セピア」効果と呼ばれます。この質問、特に次のコードスニペットを指摘するこの回答を見てください(私はこのコードを書いていないことに注意してください。質問への回答を見つけるのを手伝っただけです)

/**
*
* @param img Image to modify
* @param sepiaIntensity From 0-255, 30 produces nice results
* @throws Exception
*/
public static void applySepiaFilter(BufferedImage img, int
sepiaIntensity) throws Exception
{
// Play around with this. 20 works well and was recommended
// by another developer. 0 produces a grey image
int sepiaDepth = 20;

int w = img.getWidth();
int h = img.getHeight();

WritableRaster raster = img.getRaster();

// We need 3 integers (for R,G,B color values) per pixel.
int[] pixels = new int[w*h*3];
raster.getPixels(0, 0, w, h, pixels);

// Process 3 ints at a time for each pixel. Each pixel has 3 RGB
colors in array
for (int i=0;i<pixels.length; i+=3)
{
int r = pixels[i];
int g = pixels[i+1];
int b = pixels[i+2];

int gry = (r + g + b) / 3;
r = g = b = gry;
r = r + (sepiaDepth * 2);
g = g + sepiaDepth;

if (r>255) r=255;
if (g>255) g=255;
if (b>255) b=255;

// Darken blue color to increase sepia effect
b-= sepiaIntensity;

// normalize if out of bounds
if (b<0) b=0;
if (b>255) b=255;

pixels[i] = r;
pixels[i+1]= g;
pixels[i+2] = b;
}
raster.setPixels(0, 0, w, h, pixels);
}
于 2012-07-19T07:08:30.807 に答える
1

私はただ数字で遊んでいました。

さらにオレンジ、

より多くの赤ともう少し緑 (赤 + 緑 = 黄色)

より明るく

すべての要素を増やす

より暗い

すべての要因を減らす

シャープ

これは、周囲のピクセルを比較してエッジを見つける特定のフィルターです。色で遊ぶだけではありません。

ところで:値のキャッピングを追加する必要があります。つまり、Math.min(255, Math.max(0, 値))

于 2012-07-19T07:07:11.003 に答える