📄 imageeffect.java
字号:
WritableRaster raster = resultImage.getRaster();
int sx, sy;
//
int w = blkW * imgCol;
int h = blkH * imgRow;
for (int row=0; row<h; row+=blkH)
{
for (int col=0; col<w; col+=blkW)
{ sx = col;
sy = row;
for (int y=0; y<depth; ++y) // top
{ for (int x=y; x<blkW-y; ++x)
{
raster.setSample(sx+x, sy+y, 0, light); // get the red value
raster.setSample(sx+x, sy+y, 1, light);
raster.setSample(sx+x, sy+y, 2, light);
}
}
for (int x=0; x<depth; ++x) // left
{ for (int y=x; y<blkH-x; ++y)
{ raster.setSample(sx+x, sy+y, 0, light); // get the red value
raster.setSample(sx+x, sy+y, 1, light);
raster.setSample(sx+x, sy+y, 2, light);
}
}
sx += blkW-1;
sy += blkH-1;
for (int y=0; y<depth; ++y) // bottom
{ for (int x=y; x<blkW-y; ++x)
{
raster.setSample(sx-x, sy-y, 0, dark); // get the red value
raster.setSample(sx-x, sy-y, 1, dark);
raster.setSample(sx-x, sy-y, 2, dark);
}
}
for (int x=0; x<depth; ++x) // right
{ for (int y=x; y<blkH-x; ++y)
{
raster.setSample(sx-x, sy-y, 0, dark); // get the red value
raster.setSample(sx-x, sy-y, 1, dark);
raster.setSample(sx-x, sy-y, 2, dark); ;
}
}
}
}
return (resultImage);
}
public static BufferedImage buttonize(Image image, int imgRow, int imgCol, int depth,
Color light, Color dark
)
{ int blkW, blkH;
int imgW, imgH;
int lightR, lightG, lightB, darkR, darkG, darkB;
lightR = light.getRed(); lightG = light.getGreen(); lightB = light.getBlue();
darkR = dark.getRed(); darkG = dark.getGreen(); darkB = dark.getBlue();
BufferedImage resultImage;
imgW = image.getWidth(null);
imgH = image.getHeight(null);
resultImage = new BufferedImage(imgW, imgH, BufferedImage.TYPE_INT_ARGB); // 32-bits color image
Graphics2D g2d = (Graphics2D) resultImage.createGraphics();
g2d.drawImage(image, 0,0, null);
g2d.dispose(); // release g2d
blkW = imgW / imgCol;
blkH = imgH / imgRow;
WritableRaster raster = resultImage.getRaster();
int sx, sy;
//
int w = blkW * imgCol;
int h = blkH * imgRow;
for (int row=0; row<h; row+=blkH)
{
for (int col=0; col<w; col+=blkW)
{ sx = col;
sy = row;
for (int y=0; y<depth; ++y) // top
{ for (int x=y; x<blkW-y; ++x)
{
raster.setSample(sx+x, sy+y, 0, lightR); // get the red value
raster.setSample(sx+x, sy+y, 1, lightG);
raster.setSample(sx+x, sy+y, 2, lightB);
}
}
for (int x=0; x<depth; ++x) // left
{ for (int y=x; y<blkH-x; ++y)
{ raster.setSample(sx+x, sy+y, 0, lightR); // get the red value
raster.setSample(sx+x, sy+y, 1, lightG);
raster.setSample(sx+x, sy+y, 2, lightB);
}
}
sx += blkW-1;
sy += blkH-1;
for (int y=0; y<depth; ++y) // bottom
{ for (int x=y; x<blkW-y; ++x)
{
raster.setSample(sx-x, sy-y, 0, darkR); // get the red value
raster.setSample(sx-x, sy-y, 1, darkG);
raster.setSample(sx-x, sy-y, 2, darkB);
}
}
for (int x=0; x<depth; ++x) // right
{ for (int y=x; y<blkH-x; ++y)
{
raster.setSample(sx-x, sy-y, 0, darkR); // get the red value
raster.setSample(sx-x, sy-y, 1, darkG);
raster.setSample(sx-x, sy-y, 2, darkB); ;
}
}
}
}
return (resultImage);
}
public static Image shrinkImage(Image image, int skipX, int skipY)
{ int imgW, imgH, sW, sH, index, imgIndex;
BufferedImage resultImage;
imgW = image.getWidth(null);
imgH = image.getHeight(null);
sW = imgW / skipX;
sH = imgH / skipY;
if ( imgW % skipX != 0 ) ++sW;
if ( imgH % skipY != 0 ) ++sH;
resultImage = new BufferedImage(sW, sH, BufferedImage.TYPE_INT_ARGB); // 32-bits color image
Graphics2D g2d = (Graphics2D) resultImage.createGraphics();
g2d.drawImage(image, 0, 0, sW, sH,
0, 0, imgW, imgH,
null
);
g2d.dispose(); // release g2d
return (resultImage);
}
public static BufferedImage toBinary(Image img, int threshold)
{ int imgW, imgH, r, g, b, index, value;
int err;
int[] binary;
BufferedImage bufImage; //
imgW = img.getWidth(null);
imgH = img.getHeight(null);
bufImage = new BufferedImage(imgW, imgH, BufferedImage.TYPE_INT_ARGB); // 32-bits color image
Graphics2D g2d = (Graphics2D) bufImage.createGraphics();
g2d.drawImage(img, 0,0, null);
g2d.dispose(); // release g2d
binary = new int[imgH*imgW];
bufImage.getRGB(0, 0, imgW, imgH, binary, 0, imgW);
for (int k=0; k<binary.length; ++k)
{ r = (binary[k]>>16) & 0xff;
g = (binary[k]>> 8) & 0xff;
b = binary[k] & 0xff;
value = (int)( r*0.299 + g*0.287 + b*0.114 );
if ( value >= threshold )
{
binary[k] = 0xFFFFFFFF;
}
else
{
binary[k] = 0xFF000000;
}
}
bufImage.setRGB(0, 0, imgW, imgH, binary, 0, imgW);
return (bufImage);
}
public static BufferedImage toDotImage(Image img, int threshold)
{ int imgW, imgH, index;
double err, r, g, b, value;
double[] gray;
int[] binary;
BufferedImage bufImage; //
imgW = img.getWidth(null);
imgH = img.getHeight(null);
bufImage = new BufferedImage(imgW, imgH, BufferedImage.TYPE_INT_ARGB); // 32-bits color image
Graphics2D g2d = (Graphics2D) bufImage.createGraphics();
g2d.drawImage(img, 0,0, null);
g2d.dispose(); // release g2d
binary = new int[imgH*imgW];
bufImage.getRGB(0, 0, imgW, imgH, binary, 0, imgW);
gray = new double[imgH*imgW];
for (int k=0; k<gray.length; ++k)
{ r = (binary[k]>>16) & 0xff;
g = (binary[k]>> 8) & 0xff;
b = binary[k] & 0xff;
gray[k] = r*0.299 + g*0.587 + b*0.114;
}
for (int row=1; row<imgH-1; ++row)
{ index = row*imgW + 1;
for (int col=1; col<imgW-1; ++col)
{
if ( gray[index] >= threshold )
{ err = gray[index] - threshold;
binary[index] = 0xFFFFFFFF;
}
else
{ err = gray[index];
binary[index] = 0xFF000000;
}
gray[index+1 ] += (int)(err*7./16.); // to the right
gray[index+imgW-1] += (int)(err*3./16.); // left of next line
gray[index+imgW ] += (int)(err*5./16.); // next line
gray[index+imgW+1] += (int)(err/16.); // right of next line
++index;
}
}
index = imgW*(imgH-1);
for (int k=0; k<imgW; ++k)
{ if ( gray[k]>=threshold ) binary[k] = 0xFFFFFFFF;
else binary[k] = 0xFF000000;
if ( gray[index+k]>=threshold ) binary[index+k] = 0xFFFFFFFF;
else binary[index+k] = 0xFF000000;
}
index = 0;
for (int k=0; k<imgH; ++k)
{ if ( gray[index]>=threshold ) binary[index] = 0xFFFFFFFF;
else binary[index] = 0xFF000000;
if ( gray[index+imgW-1]>=threshold ) binary[index+imgW-1] = 0xFFFFFFFF;
else binary[index+imgW-1] = 0xFF000000;
index += imgW;
}
bufImage.setRGB(0, 0, imgW, imgH, binary, 0, imgW);
return (bufImage);
}
public static BufferedImage grayFiltering(Image img, int[] filter, int total)
{ int imgW, imgH, r, g, b, index, value;
int prev, next;
int[] gray, result;
BufferedImage bufImage, bufImg; //
imgW = img.getWidth(null);
imgH = img.getHeight(null);
bufImage = new BufferedImage(imgW, imgH, BufferedImage.TYPE_INT_ARGB); // 32-bits color image
Graphics2D g2d = (Graphics2D) bufImage.createGraphics();
g2d.drawImage(img, 0,0, null);
g2d.dispose(); // release g2d
// another new BufferedImage bufImg for showing result
gray = new int[imgH*imgW];
result = new int[imgH*imgW];
bufImage.getRGB(0, 0, imgW, imgH, gray, 0, imgW);
index = 0;
for (int row=0; row<imgH; ++row)
{ for (int col=0; col<imgW; ++col)
{ r = (gray[index]>>16) & 0xff;
g = (gray[index]>> 8) & 0xff;
b = gray[index] & 0xff;
gray[index] = (int)(0.299*r + 0.587*g + 0.114*b);
++index;
}
}
if ( total==0 ) total = 1;
for (int row=1; row<imgH-1; ++row)
{ index = row*imgW + 1;
for (int col=1; col<imgW-1; ++col)
{ prev = index-imgW;
next = index+imgW;
value = gray[prev -1] * filter[0] +
gray[prev ] * filter[1] +
gray[prev +1] * filter[2] +
gray[index-1] * filter[3] +
gray[index ] * filter[4] +
gray[index+1] * filter[5] +
gray[next -1] * filter[6] +
gray[next ] * filter[7] +
gray[next +1] * filter[8] ;
value = (value/total);
if ( value > 255 ) value = 255;
else if ( value<0 ) value = 0;
result[index] = 0xFF000000 + (value<<16) + (value<<8) + value;
++index;
}
}
bufImage.setRGB(0, 0, imgW, imgH, result, 0, imgW);
return (bufImage);
}
public static Image colorFiltering(Image img, int[] filter, int total)
{ int imgW, imgH, r, g, b, index, valueR, valueG, valueB;
int prev, next;
int[] gray, result;
BufferedImage bufImage, bufImg; //
imgW = img.getWidth(null);
imgH = img.getHeight(null);
bufImage = new BufferedImage(imgW, imgH, BufferedImage.TYPE_INT_ARGB); // 32-bits color image
Graphics2D g2d = (Graphics2D) bufImage.createGraphics();
g2d.drawImage(img, 0,0, null);
g2d.dispose(); // release g2d
// another new BufferedImage bufImg for showing result
gray = new int[imgH*imgW];
result = new int[imgH*imgW];
bufImage.getRGB(0, 0, imgW, imgH, gray, 0, imgW);
if ( total==0 ) total = 1;
for (int row=1; row<imgH-1; ++row)
{ index = row*imgW + 1;
for (int col=1; col<imgW-1; ++col)
{ prev = index-imgW;
next = index+imgW;
valueR = ((gray[prev -1]>>16) & 0xFF) * filter[0] +
((gray[prev ]>>16) & 0xFF) * filter[1] +
((gray[prev +1]>>16) & 0xFF) * filter[2] +
((gray[index-1]>>16) & 0xFF) * filter[3] +
((gray[index ]>>16) & 0xFF) * filter[4] +
((gray[index+1]>>16) & 0xFF) * filter[5] +
((gray[next -1]>>16) & 0xFF) * filter[6] +
((gray[next ]>>16) & 0xFF) * filter[7] +
((gray[next +1]>>16) & 0xFF) * filter[8] ;
valueG = ((gray[prev -1]>> 8) & 0xFF) * filter[0] +
((gray[prev ]>> 8) & 0xFF) * filter[1] +
((gray[prev +1]>> 8) & 0xFF) * filter[2] +
((gray[index-1]>> 8) & 0xFF) * filter[3] +
((gray[index ]>> 8) & 0xFF) * filter[4] +
((gray[index+1]>> 8) & 0xFF) * filter[5] +
((gray[next -1]>> 8) & 0xFF) * filter[6] +
((gray[next ]>> 8) & 0xFF) * filter[7] +
((gray[next +1]>> 8) & 0xFF) * filter[8] ;
valueB = (gray[prev -1] & 0xFF) * filter[0] +
(gray[prev ] & 0xFF) * filter[1] +
(gray[prev +1] & 0xFF) * filter[2] +
(gray[index-1] & 0xFF) * filter[3] +
(gray[index ] & 0xFF) * filter[4] +
(gray[index+1] & 0xFF) * filter[5] +
(gray[next -1] & 0xFF) * filter[6] +
(gray[next ] & 0xFF) * filter[7] +
(gray[next +1] & 0xFF) * filter[8] ;
valueR = (valueR/total);
if ( valueR > 255 ) valueR = 255;
else if ( valueR<0 ) valueR = 0;
valueG = (valueG/total);
if ( valueG > 255 ) valueG = 255;
else if ( valueG<0 ) valueG = 0;
valueB = (valueB/total);
if ( valueB > 255 ) valueB = 255;
else if ( valueB<0 ) valueB = 0;
result[index] = 0xFF000000 + (valueR<<16) + (valueG<<8) + valueB;
++index;
}
}
bufImage.setRGB(0, 0, imgW, imgH, result, 0, imgW);
return (bufImage);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -