argon bulletin board
		Факултети => Факултет по математика и информатика => Темата е започната от: JOKe в 08.10.2007, 15:39:58
		
			
			- 
				а ве имам въпросче към GradientPaint ако някой е използвал 
въпроса ми е когато го сложа за backGround всичко е окей той има 6 аргументен конструктор
GradientPaint background = new GradientPaint(
            0f, 0f, Color.GRAY.darker(),
            0f, 140, Color.BLACK.brighter());
аз го разбирам като от какъв цвят и къде да почне градиент-а.
в случая това изглежда така : 
(http://fmi.zloba.net/wp-content/uploads/2007/10/gradient1.jpg)
което е СУПЕР
обаче проблема идва когато искам да имам текст + картинка който да градиентвам по някакъв начин самите тях по скоро искам да създам нещо като (mask) в контекст на photoshop в/у тях и нямам идея как да стане...
идеята е да получа нещо такова : 
(http://fmi.zloba.net/wp-content/uploads/2007/10/logo.png)
(Създадено с 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);
	}
}
Резултата е : 
(http://fmi.zloba.net/wp-content/uploads/2007/10/gradient2.jpg)
както се вижда доло има 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 в него т.е. някъде отдоло и няма да се види.
			 
			
			- 
				Намерих го как става от 
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;
		}
}
Резултата изглежда така : 
(http://fmi.zloba.net/wp-content/uploads/2007/10/reflectionsalpha.JPG)