Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
372 views
in Technique[技术] by (71.8m points)

java image crop

I am aware of BufferedImage.getSubimage However, it cant deal with cropping images that are smaller than the cropping size throwing the exception:

java.awt.image.RasterFormatException: (y + height) is outside raster

I want to be able to crop either a PNG/JPG/GIF to a certain size however if the image is smaller than the cropping area centre itself on a white background. Is there a call to do this? Or do I need to create an image manually to centre the image on if so, how would I go about this?

Thanks

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You cannot crop an image larger, only smaller. So, you start with the goal dimension,let's say 100x100. And your BufferedImage (bi), let's say 150x50.

Create a rectangle of your goal:

Rectangle goal = new Rectangle(100, 100);

Then intersect it with the dimensions of your image:

Rectangle clip = goal.intersection(new Rectangle(bi.getWidth(), bi.getHeight());

Now, clip corresponds to the portion of bi that will fit within your goal. In this case 100 x50.

Now get the subImage using the value of clip.

BufferedImage clippedImg = bi.subImage(clip,1, clip.y, clip.width, clip.height);

Create a new BufferedImage (bi2), the size of goal:

BufferedImage bi2 = new BufferedImage(goal.width, goal.height);

Fill it with white (or whatever bg color you choose):

Graphics2D big2 = bi2.getGraphics();
big2.setColor(Color.white);
big2.fillRect(0, 0, goal.width, goal.height);

and draw the clipped image onto it.

int x = goal.width - (clip.width / 2);
int y = goal.height - (clip.height / 2);
big2.drawImage(x, y, clippedImg, null);

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...