问题描述
提前感谢您的帮助
描述:
程序绘制,显示和保存图像。它的工作原理如下:对象本身扩展了Frame。在构造函数中,该对象创建一个BufferedImage,并调用一个绘制到该图像上的方法。然后,它将图像显示在帧上。最后,它将图像保存到文件中(我不关心它使用的是什么格式)。主程序创建了对象,剩下的就完成了。
Description:The program draws, displays, and saves an image. It works as following: the object itself extends Frame. In the constructor, the object creates a BufferedImage, and calls a method that draw onto that image. Then, it displays the image onto the Frame. Finally, it saves the image into a file (I don't care what format it uses). The main program creates the object, which does the rest.
问题:
保存的文件总是有彩色背景!由于显示的图像很好,这尤其奇怪。如果我在ImageIO.write()中使用jpg格式,背景会偏红。如果我使用png格式,背景为深灰色。
Problem:The saved file always has a colored background! This is especially wierd since the displayed image is fine. If I use "jpg" format with ImageIO.write(), the background is reddish. If I use the "png" format, the background is dark grey.
我已经花了一段时间,我仍然不知道到底发生了什么!
I've spent a while on this, and I still have no idea what the hell is happening!
import java.awt.Frame ;
import java.awt.image.BufferedImage ;
import java.io.IOException ;
import java.awt.event.WindowEvent ;
import java.awt.event.WindowAdapter ;
import java.awt.Toolkit ;
import java.awt.Graphics2D ;
import java.awt.Graphics ;
import java.awt.Color ;
import java.awt.Dimension ;
import javax.imageio.ImageIO ;
import java.io.File ;
import java.awt.geom.Rectangle2D;
public class HGrapher extends Frame{
private BufferedImage img ;
private float colors[][] ; //the colors for every rectangle
private double availWidth ;
private double availHeight ;
public HGrapher(String saveFileName, int numRects) throws IOException {
//*add window closer
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0); }
});
//*get colors to use
setColors( numRects) ;
//*figure out the size of the image and frame
this.availHeight = (3.0/4) * Toolkit.getDefaultToolkit().getScreenSize().height ;
this.availWidth = (3.0/4) * Toolkit.getDefaultToolkit().getScreenSize().width ;
//*create the image
this.img = new BufferedImage( (int)availWidth, (int)availHeight, BufferedImage.TYPE_INT_ARGB);
Graphics2D drawer = img.createGraphics() ;
drawer.setBackground(Color.WHITE);
this.makeImg( drawer) ;
//*display the image
this.setSize( new Dimension( (int)availWidth, (int)availHeight ) ) ;
this.setVisible(true);
//*save the image
ImageIO.write(img, "jpg",new File( (saveFileName +".jpg") ) );
}
//*draws the image by filling rectangles whose color are specified by this.colors
public void makeImg( Graphics2D drawer) {
double rectWidth = this.availWidth / (double)colors.length ;
for(int i = 0 ; i < colors.length ; i ++) {
drawer.setColor( new Color( this.colors[i][0], this.colors[i][1], this.colors[i][2],
this.colors[i][3] ) ) ;
drawer.fill( new Rectangle2D.Double( rectWidth*i, 0, rectWidth, this.availHeight ) ) ;
}
}
//*paint method
public void paint(Graphics g) {
Graphics2D drawer = (Graphics2D)g ;
drawer.drawImage(img, 0, 0, null) ;
}
//*creates an array of the colors rectangles are filled with
public void setColors( int numRects) {
this.colors = new float[ numRects][4] ;
//*make every 1st rect red
for(int i = 0 ; i< colors.length ; i+= 3) {
this.colors[i][0] = (float).8 ; this.colors[i][1] = (float).1 ; this.colors[i][2] = (float).1 ;
this.colors[i][3] = (float).8 ; }
//*make every 2nd rect green
for(int i = 1 ; i< colors.length ; i+= 3) {
this.colors[i][0] = (float).1 ; this.colors[i][1] = (float).8 ; this.colors[i][2] = (float).1 ;
this.colors[i][3] = (float).8 ; }
//*make every 3rd rect
for(int i = 2 ; i< colors.length ; i+= 3) {
this.colors[i][0] = (float).1 ; this.colors[i][1] = (float).1 ; this.colors[i][2] = (float).8 ;
this.colors[i][3] = (float).8 ; }
}
public static void main (String[]args) throws IOException {
HGrapher hg = new HGrapher("saved", 14) ;
}
}
推荐答案
setBackground()
仅设置用于清除图像的Color,它实际上不会清除图像。在 setBackground()
之后调用 Graphics.clearRect(int,int,int,int)
。像这样:
setBackground()
only set the Color that is used to clear the image, it does not actually clear the image. Call Graphics.clearRect(int,int,int,int)
after setBackground()
. Like so:
//*create the image
this.img = new BufferedImage( (int)availWidth, (int)availHeight, BufferedImage.TYPE_INT_ARGB);
Graphics2D drawer = img.createGraphics() ;
drawer.setBackground(Color.WHITE);
drawer.clearRect(0,0,(int)availWidth,(int)availHeight);
这篇关于Java BufferedImage可以保存不需要的背景颜色的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!