как я могу получить эффект пера с помощью java 2D?

Я использую приведенные ниже коды для печати ABC в java:

String NAME="ABC";
int FONT_SIZE=100;

BufferedImage image = new BufferedImage(400, 300, BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();

g.setColor(new Color(255,255,255));
g.fillRect(0, 0, image.getWidth(), image.getHeight());

g.setColor(new Color(0,0,0));
g.setFont(new Font("arial", Font.PLAIN ,FONT_SIZE));
g.drawString(NAME,FONT_SIZE,FONT_SIZE);

g.dispose();

//write to file
ByteArrayOutputStream out = new ByteArrayOutputStream();
ImageIO.write(image, "PNG", out);
byte[] byteArray = out.toByteArray();
bytesToFile(byteArray,"D:/temp/pic/text/text.jpg");

Я получаю изображение результата: введите здесь описание изображения

как я могу получить этот «эффект пера» в java? (или любая другая java-библиотека)

Спасибо за помощь :)


person Koerr    schedule 14.02.2011    source источник
comment
Ключевое слово, которое вы ищете, это сглаживание.   -  person Joachim Sauer    schedule 14.02.2011


Ответы (4)


Вы должны иметь возможность преобразовать свою графику в Graphics2D и использовать следующую строку кода:

graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                            RenderingHints.VALUE_ANTIALIAS_ON);

См. http://download.oracle.com/javase/6/docs/api/java/awt/Graphics2D.html для получения дополнительной информации.

person JB Nizet    schedule 14.02.2011

Проблема, с которой вы столкнулись, называется псевдонимом. Попробуйте включить сглаживание, что-то вроде

Graphics2D.setRenderingHints(Graphics2D.ANTIALIASING,Graphics2D.ANTIALIAS_ON)
person Martin Klinke    schedule 14.02.2011
comment
+1, спасибо, но в вашем коде есть проблемы, это правильно: g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); - person Koerr; 14.02.2011

Как объяснялось в предыдущих ответах, проблема заключается в сглаживании.

Псевдонимы возникают, когда сигнал (в данном случае сигнал 2D-графики) дискретизируется и квантуется из непрерывного пространства в дискретное пространство. Выборка — это процесс считывания значения непрерывно изменяющегося сигнала. Квантование — это процесс, посредством которого этим непрерывным дискретным значениям присваивается дискретное значение в конечном пространстве, представленном цифровыми (двоичными) системами.

Псевдонимы являются побочным продуктом этого квантования. Люди воспринимают этот побочный продукт визуально как резкие изменения цвета от пикселя к пикселю. Специалисты по графике часто называют эти зубчатые края неровностями.

Java 2D позволяет вам установить одну из нескольких подсказок рендеринга, чтобы указать, что вы хотите, чтобы ваша 2D-графика была отрисована с использованием алгоритмов сглаживания, которые сглаживают края.

Для этого есть пример главы на javaworld.com.

Это объясняется здесь:

/**
* Example05 illustrates some basics of Java 2D.
* This version is compliant with Java 1.2 Beta 3, Jul 1998.
* Please refer to: <BR>
* http://www.javaworld.com/javaworld/jw-08-1998/jw-08-media.html
* <P>
* @author Bill Day <[email protected]>
* @version 1.0
* @see java.awt.Font
* @see java.awt.Graphics2D
* @see java.awt.geom.AffineTransform
* @see java.awt.geom.GeneralPath
**/

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;

public class Example05 extends Frame {
/**
* Instantiates an Example05 object.
**/
public static void main(String args[]) {
 new Example05();
}

 /**
 * Our Example05 constructor sets the frame's size, adds the
 * visual components, and then makes them visible to the user.
 * It uses an adapter class to deal with the user closing
 * the frame.
 **/
 public Example05() {
 //Title our frame.
 super("Java 2D Example05");

 //Set the size for this frame.
 setSize(330,270); 

 //We need to turn on the visibility of our frame
 //by setting the Visible parameter to true.
 setVisible(true);

 //Now, we want to be sure we properly dispose of resources 
 //this frame is using when the window is closed.  We use 
 //an anonymous inner class adapter for this.
 addWindowListener(new WindowAdapter() 
  {public void windowClosing(WindowEvent e) 
     {dispose(); System.exit(0);}  
   }
 );
}

/**
* The paint method is where the real magic is.  In previous
* examples, we saw some jagged edges due to aliasing.
* Example05 illustrates how to use rendering hints to request
* an anti-aliased render from Graphics2D.
**/
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D) g;

//This time, we want to use anti-aliasing if possible
//to avoid the jagged edges that were so prominent in
//our last example.  With ask the Java 2D rendering
//engine (Graphics2D) to do this using a "rendering hint".
g2d.setRenderingHints(Graphics2D.ANTIALIASING,
   Graphics2D.ANTIALIAS_ON);

//We reuse our GeneralPath filled shape.  We translate
//and rotate this shape as we did before.
GeneralPath path = new GeneralPath(GeneralPath.EVEN_ODD);
path.moveTo(0.0f,0.0f);
path.lineTo(0.0f,125.0f);
path.quadTo(100.0f,100.0f,225.0f,125.0f);
path.curveTo(260.0f,100.0f,130.0f,50.0f,225.0f,0.0f);
path.closePath();

AffineTransform at = new AffineTransform();
at.setToRotation(-Math.PI/8.0);
g2d.transform(at);
at.setToTranslation(0.0f,150.0f);
g2d.transform(at);

g2d.setColor(Color.green);
g2d.fill(path);

//Now, let's use some of the Java font and text support.
//Note that you need to be sure you have the same fonts I
//use in the example (Times New Roman True Type) if you
//execute this example code.
Font exFont = new Font("TimesRoman",Font.PLAIN,40);

//Un-comment the following diagnostic println's if you
//want to see what font was returned.  This can be useful
//when you have limited font supports on your system and
//are not sure which font the Java runtime may have
//substituted for your requested font.
//System.out.println(exFont.getFamily());
//System.out.println(exFont.isPlain());
//System.out.println(exFont.getSize());

g2d.setFont(exFont);
g2d.setColor(Color.black);
g2d.drawString("JavaWorld",0.0f,0.0f);
}
}

Они взяты с: javaworld.com

person kamaci    schedule 14.02.2011

Также

g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);

может помочь

person Ma99uS    schedule 14.02.2011