基于像素数Java创建/裁剪图像
Posted
技术标签:
【中文标题】基于像素数Java创建/裁剪图像【英文标题】:Creating/Cropping image base on number of pixels Java 【发布时间】:2018-03-26 06:44:14 【问题描述】:如何将图像裁剪为指定数量的像素或创建输出将基于像素数而不是矩形形状的图像。 通过使用下面的代码,我只能得到方形或矩形。
BufferedImage out = img.getSubimage(0, 0, 11, 11);
但它只会将其裁剪为矩形
import java.io.File;
import java.io.IOException;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
public class raNd
public static void main(String args[])throws IOException
//image dimension
int width = 10;
int height = 10;
//create buffered image object img
BufferedImage img = new BufferedImage(width, height,
BufferedImage.TYPE_INT_ARGB);
//file object
File f = null;
//create random image pixel by pixel
for(int y = 0; y < height; y++)
for(int x = 0; x < width; x++)
int a = 255;//(int)(Math.random()*256); //alpha
int r = (int)(Math.random()*256); //red
int g = (int)(Math.random()*256); //green
int b = (int)(Math.random()*256); //blue
int p = (a<<24) | (r<<16) | (g<<8) | b; //pixel
img.setRGB(x, y, p);
//write image
try
f = new File("/Users/kingamada/Documents/Java/Test6.png");
BufferedImage out = img.getSubimage(0, 0, 5, 2);
ImageIO.write(out, "png", f);
catch(IOException e)
System.out.println("Error: " + e);
//main() ends here
//class ends here
Sample Picture
我想裁剪掉最后的白色像素,所以图片不会是矩形。
【问题讨论】:
你不能。不过,您可以通过将 alpha 设置为零来使它们透明。 我读到了这个 [***.com/questions/43541086/…,它建议我使用 Generatepath,但我无法按照我的意愿将其剪切掉。我的坐标有问题。 您可以在绘制图像时使用剪辑Shape
。
我真的是一个初学者,所以代码或解释肯定会帮助我完成。
让像素透明会简单得多,不是吗?
【参考方案1】:
所以假设你需要保留的像素数在变量int pixelsLimit;
中:
int pixels = 0;
for(int y = 0; y < height; y++)
for(int x = 0; x < width; x++)
int p = 0;
if (pixels < pixelsLimit)
int a = 255;//(int)(Math.random()*256); //alpha
int r = (int)(Math.random()*256); //red
int g = (int)(Math.random()*256); //green
int b = (int)(Math.random()*256); //blue
p = (a<<24) | (r<<16) | (g<<8) | b; //pixel
img.setRGB(x, y, p);
++pixels;
【讨论】:
【参考方案2】:Java 图像是矩形的,但人们建议您可以将不想透明的像素设置为透明。
Ellipse2D clip = new Ellipse2D.Double(0, 0, width, height);
for(int y = 0; y < height; y++)
for(int x = 0; x < width; x++)
if(!clip.contains(x,y))
img.setRGB(x, y, 0);
这可以直接添加到现有代码中,使您的图像成为椭圆。另一种方法是使用裁剪形状和图形对象。我已经替换了你完整的写入图像块。
//write image
try
f = new File("Test6.png");
Ellipse2D clip = new Ellipse2D.Double(0, 0, width, height);
BufferedImage clipped = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics g = clipped.getGraphics();
g.setClip(clip); //ellipse from above.
g.drawImage(img, 0, 0, null);
g.dispose();
ImageIO.write(clipped, "png", f);
catch(IOException e)
System.out.println("Error: " + e);
这为我编译并写了一个小圆形图像。
【讨论】:
以上是关于基于像素数Java创建/裁剪图像的主要内容,如果未能解决你的问题,请参考以下文章