当前位置: 源码素材网 » Java教程 » 详情页

Java在页面上对图像文件规定高和宽

  •   时间:2019-02-07
  • 概述:自定义图像

Java在页面上对图像文件规定高和宽,Netscape 对于HTML 文件做了很大贡献,其中就有<IMG>标签的HEIGHT 和WIDTH 属性。对于用户来说,如果图像包括HEIGH 和WIDTH 属性的话比没有这些属性的图像装载要快得多,这主要是因为浏览器一旦知道图像占多大空间就能够马上装载。而不需要用户等待直到其它文本装载完才能装载图像。本例通过编程实现了对HTML 文件上的图像文件规定高度和宽度,重写此HTML 文件以便快速装载页面。运行程序,并在后面加上URL 作为参数,就可以获得重写后的此HTML 的文本输出。

实现方法:
MediaTracker 对象经常被用在关联Applet 或者java.awt.Toolkit 的getImaget()方法上。
MdeiaTracker 对象确保在程序继续执行前图像装载完成。
WaitForID()方法给每个图像都设置一个ID 号,MediaTracker 跟踪装载图像直到这个图像完成装载或者被放弃。如果另外一个线程中断此线程,就抛出一个InterruptedException 异常。例如:在开始装载带有ID1 的图像直到装载完成,需要编写如下代码:

try
{
tracker.waitForID(1);
}
catch (InterruptedException e) {}

通过使用HTMLEditorKit.Parser 对象程序获取需求的页面。通过缺省的Toolkit 对象的getImage()方法重新得到此Image 对象,使用Image 的getWidth()和getHeight()方法来测量图像的高度和宽度,MediaTracker 对象确保高度和宽度可用,在一个特定图像的高度和宽度读取前,MdeiaTracker 对象的waitForID()方法使此图像首先被装载完成。

程序代码:

1.编写useImageSizer 类的基本框架,该类继承了HTMLEditorKit.ParserCallback 类,该类包括Writer 对象变量out 和URL 对象变量base,该类还包括handleStartTag()方法、handleEndTag()方法、writeAttributes ()方法、handleComment()方法、handleText()方法、handleSimpleTag()方法、main()方法和构造器方法,代码如下:

public class useImageSizer extends HTMLEditorKit.ParserCallback
{
private Writer out;
private URL base;
//构造器
public useImageSizer(Writer out, URL base);
public void handleStartTag(HTML.Tag tag,MutableAttributeSet attributes, int position);
public void handleEndTag(HTML.Tag tag, int position);
private void writeAttributes(HTML.Tag tag, AttributeSet attributes);
public void handleComment(char[] text, int position);
public void handleText(char[] text, int position);
public void handleSimpleTag(HTML.Tag tag,MutableAttributeSet attributes, int position);
public static void main(String[] args);
}

2.UseImageSizer 类的构造器方法用于构建该类,代码如下:

public useImageSizer(Writer out, URL base)
{
this.out = out;
this.base = base;
}

3.HandleStartTag()方法用于处理开始标记,代码如下:

public void handleStartTag(HTML.Tag tag,MutableAttributeSet attributes, int position)
{
try
{
out.write("<" + tag);
this.writeAttributes(tag, attributes);
out.write(">");
out.flush();
}
catch (IOException e)
{
System.err.println(e);
e.printStackTrace();
}
}

4.HandleEndTag()方法用于处理结束标记,代码如下:

public void handleEndTag(HTML.Tag tag, int position)
{
try
{
out.write("</" + tag + ">");
if (tag.breaksFlow()) out.write("\r\n");
out.flush();
}
catch (IOException e)
{
System.err.println(e);
}
}

5.WriteAttributes()方法用于重写图像属性,代码如下:

//重写图像属性
private void writeAttributes(HTML.Tag tag, AttributeSet attributes)
	throws IOException
	{
 		Enumeration e = attributes.getAttributeNames();
 		while (e.hasMoreElements())
 		{
   			Object name = e.nextElement();
   			String value = (String) attributes.getAttribute(name);
   			out.write(" " + name + "=\"" + value + "\"");
 		}
 		if (tag == HTML.Tag.IMG)
 		{
   			try
   			{
     			if (attributes.getAttribute(HTML.Attribute.HEIGHT) == null
      			|| attributes.getAttribute(HTML.Attribute.WIDTH) == null)
      			{
        				URL u = new URL(base, (String) attributes.getAttribute(HTML.Attribute.SRC));
        				Image img = Toolkit.getDefaultToolkit().getImage(u);
        				Component temp = new Label();
        				MediaTracker tracker = new MediaTracker(temp);
        				tracker.addImage(img, 1);
       				try
       				{
          					tracker.waitForID(1);
          					if (attributes.getAttribute(HTML.Attribute.WIDTH) == null)
          					{
            						out.write(" WIDTH=\"" + img.getWidth(temp) + "\"");
          					}
          					if (attributes.getAttribute(HTML.Attribute.HEIGHT) == null)
          					{
            						out.write(" HEIGHT=\"" + img.getHeight(temp) + "\"");
          					}
        				}
        				catch (InterruptedException ex)
        				{ }
     			}
   			}
   			catch (MalformedURLException ex)
   			{
     			// SRC attribute is malformed
   			}
 		}
}

6.HandleComment()方法用于处理注释,代码如下:

//注释处理
public void handleComment(char[] text, int position)
{
	try
	{
 		out.write("<!-- ");
 		out.write(text);
 		out.write(" -->");
 		out.flush();
	}
	catch (IOException e)
	{
 		System.err.println(e);
	}
}

7.HandleText()方法用于文本处理,代码如下:

//文本处理
public void handleText(char[] text, int position)
{
	try
	{
 		out.write(text);
 		out.flush();
	}
	catch (IOException e)
	{
 		System.err.println(e);
 		e.printStackTrace();
	}
}

8.HandleSimpleTag()方法用于对简单标记进行处理,代码如下:

//简单标记处理
public void handleSimpleTag(HTML.Tag tag,MutableAttributeSet attributes, int position)
{
	try
	{
 			out.write("<" + tag);
 			this.writeAttributes(tag, attributes);
 			out.write(">");
	}
	catch (IOException e)
	{
 			System.err.println(e);
 			e.printStackTrace();
	}
}

9.Main()方法调用上述方法在页面上对图像文件规定高和宽:

	//主程序
public static void main(String[] args)
{
	for (int i = 0; i < args.length; i++)
	{
		// The ParserGetter class is from Chapter 8
		ParserGetter kit = new ParserGetter();
		HTMLEditorKit.Parser parser = kit.getParser();
   		try
   		{
 			URL u = new URL(args[0]);
 			InputStream in = u.openStream();
 			InputStreamReader r = new InputStreamReader(in);
 			HTMLEditorKit.ParserCallback callback= new useImageSizer(new OutputStreamWriter(System.out), u);
 			parser.parse(r, callback, false);
		}
		catch (IOException e)
		{
 			System.err.println(e);
 			e.printStackTrace();
		}
	}
}

UseImageSizer 类引入了如下的包:

import javax.swing.text.*;
import javax.swing.text.html.*;
import javax.swing.text.html.parser.*;
import java.io.*;
import java.net.*;
import java.util.*;
import java.awt.*;
import java.awt.image.*;

    相关内容:

    相关声明:

      若“Java在页面上对图像文件规定高和宽”有损您的权益,请告之我们删除内容。
      部分文章来源于网络,版权归原作者所有。