argon bulletin board

Експертно търсене  

Новини:

Регистрирането на нови потребители е временно деактивирано.

Автор Тема: Java Gradient Paint Някой да е ползвал ?  (Прочетена 765 пъти)

JOKe

  • Неактивен Неактивен
  • Публикации: 2656
  • Code or Die

а ве имам въпросче към GradientPaint ако някой е използвал
въпроса ми е когато го сложа за backGround всичко е окей той има 6 аргументен конструктор
GradientPaint background = new GradientPaint(
            0f, 0f, Color.GRAY.darker(),
            0f, 140, Color.BLACK.brighter());

аз го разбирам като от какъв цвят и къде да почне градиент-а.
в случая това изглежда така :

което е СУПЕР
обаче проблема идва когато искам да имам текст + картинка който да градиентвам по някакъв начин самите тях по скоро искам да създам нещо като (mask) в контекст на photoshop в/у тях и нямам идея как да стане...
идеята е да получа нещо такова :

(Създадено с Tool ( Photoshop like )
ако забелязвате долния Reflection text + картинката са с градиент в/у тях
е как да стане тази мизерия
пробвах така :
import java.awt.AlphaComposite;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JComponent;
import javax.swing.JFrame;

import org.freehep.swing.graphics.PanelArtistUtilities;

public class Canvascho extends JComponent
{


private BufferedImage image;
public Canvascho()
{

try
{
image=ImageIO.read(new File("D:\\My Documents\\JLOGO.png"));
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g;
AffineTransform defaultTransform=g2d.getTransform();

g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_RENDERING,
        RenderingHints.VALUE_RENDER_QUALITY);
// Paint a gradient for the sky

GradientPaint background = new GradientPaint(
0f, 0f, Color.GRAY.darker(),
0f, 140, Color.BLACK.brighter());
g2d.setPaint(background);
g2d.fillRect(0, 0, getWidth(), getHeight());
g2d.setFont(new Font("Arial",Font.PLAIN,48));
g2d.setColor(Color.white);
String theString="JOKe";
// g2d.drawString(theString, 100, 100);
// AffineTransform rotate=AffineTransform.getScaleInstance(-0.3, 1);
// g2d.transform(rotate);
g2d.drawString(theString, 100, 100);
g2d.drawImage(image,  220, 36,null);
g2d.transform(PanelArtistUtilities.getYFlipTransform(203));
g2d.drawRect(20,40,310,250);
GradientPaint fill = new GradientPaint(
0f, 0f, Color.WHITE.darker(),
0f, 48, Color.GRAY.brighter());
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f));
g2d.setPaint(fill);
g2d.drawString(theString, 100, 100);
g2d.drawImage(image,  220, 36,null);
}
public static void main(String[] args)
{
JFrame frame=new JFrame();
frame.setLayout(new BorderLayout());
frame.add(new Canvascho(),BorderLayout.CENTER);
frame.setSize(500,500);
frame.setVisible(true);
}
}


Резултата е :


както се вижда доло има alpha fade от AlphaComposite-a ама няма Gradient ..
Явно тънкия момент е в :
      GradientPaint fill = new GradientPaint(
            0f, 0f, Color.WHITE.darker(),
            0f, 48, Color.GRAY.brighter());
но незнам спрямо какво да го смятам тъй като съм FLIPнал всичко.

( ако някой ще компилира за глупавия Filp му трябва http://java.freehep.org/maven2/org/freehep/freehep-swing/2.0.3/freehep-swing-2.0.3.jar )
Може и без него ама математиката ми куца и не ми се мислише :)
та я обяаснете този параметър на градиеннт-а за какво е ? това спрямо Clip-a на самия компонент ли е или е за самия него смисъл ако имам нещо намиращо се на 100,100 ширина 100 и височина 100 и напиша че градиента почва от 120 120 ще почне от 20 в него или от 120 в него т.е. някъде отдоло и няма да се види.
Активен

JOKe

  • Неактивен Неактивен
  • Публикации: 2656
  • Code or Die
Re: Java Gradient Paint Някой да е ползвал ?
« Отговор #1 -: 09.10.2007, 10:26:43 »

Намерих го как става от
http://filthyrichclients.org/
или по скоро книжката Filthy Rich Clients Chapter-а за Gradients 7 май се води :
private BufferedImage createReflection(BufferedImage image) {
int height = image.getHeight();
BufferedImage result = new BufferedImage(image.getWidth(),
height * 2, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = result.createGraphics();
// Paints original image
g2.drawImage(image, 0, 0, null);
// Paints mirrored image
g2.scale(1.0, -1.0);
g2.drawImage(image, 0, -height - height, null);
g2.scale(1.0, -1.0);
// Move to the origin of the clone
g2.translate(0, height);
// Creates the alpha mask
GradientPaint mask;
mask = new GradientPaint(0, 0, new Color(1.0f, 1.0f,
1.0f, 0.5f),
0, height / 2, new Color(1.0f, 1.0f, 1.0f, 0.0f));
g2.setPaint(mask);
// Sets the alpha composite
g2.setComposite(AlphaComposite.DstIn);
// Paints the mask
g2.fillRect(0, 0, image.getWidth(), height);
g2.dispose();
return result;
}

Цял пример :
package filthy;

import java.awt.AlphaComposite;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JComponent;
import javax.swing.JFrame;

public class FiltyReflection extends JComponent
{
private BufferedImage image;
public FiltyReflection()
{
try
{
image=ImageIO.read(new File("D:\\My Documents\\JLOGO.png"));
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
protected void paintComponent(Graphics g)
{
//draw background
Graphics2D g2d=(Graphics2D)g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_RENDERING,
        RenderingHints.VALUE_RENDER_QUALITY);
// Paint a gradient for the sky

GradientPaint background = new GradientPaint(
0f, 0f, Color.GRAY.darker(),
0f, 140, Color.BLACK.brighter());
g2d.setPaint(background);
g2d.fillRect(0, 0, getWidth(), getHeight());
//end
if(image!=null)
{
BufferedImage img=createReflection(image);
g.drawImage(img, 0, 0, null);
}
}
public static void main(String[] args)
{
JFrame frame=new JFrame();
frame.setLayout(new BorderLayout());
frame.add(new FiltyReflection(),BorderLayout.CENTER);
frame.setSize(700,700);
frame.setVisible(true);
}
private BufferedImage createReflection(BufferedImage image) {
int height = image.getHeight();
BufferedImage result = new BufferedImage(image.getWidth(),
height * 2, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = result.createGraphics();
// Paints original image
g2.drawImage(image, 0, 0, null);
// Paints mirrored image
g2.scale(1.0, -1.0);
g2.drawImage(image, 0, -height - height, null);
g2.scale(1.0, -1.0);
// Move to the origin of the clone
g2.translate(0, height);
// Creates the alpha mask
GradientPaint mask;
mask = new GradientPaint(0, 0, new Color(1.0f, 1.0f,
1.0f, 0.5f),
0, height / 2, new Color(1.0f, 1.0f, 1.0f, 0.0f));
g2.setPaint(mask);
// Sets the alpha composite
g2.setComposite(AlphaComposite.DstIn);
// Paints the mask
g2.fillRect(0, 0, image.getWidth(), height);
g2.dispose();
return result;
}
}


Резултата изглежда така :
Активен