基于像素数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创建/裁剪图像的主要内容,如果未能解决你的问题,请参考以下文章

响应式图像裁剪

动态规划之基于接缝裁剪的图像压缩

UIImage裁剪透明像素

java Android - 以编程方式处理图像缩放/裁剪

PHP裁剪图像以固定宽度和高度而不丢失尺寸比

如何裁剪部分gif图像?