`

SWT中的bitmapdata,和自己封装的image工具类

阅读更多

关于swt中image的图片信息保存,bitmapdata的用法

bitmapdata其实就是一个图片的信息值,比如一个图片是100*100的size,那么它就有10000个像素点,每个像素点其实就一个颜色值。这个颜色值就是一个32位的ARGB值,用uint整数类型表示,即alpha 和red green blue 三原色。这样的数组组成了所有的图片。0xFF669900表示一个不透明的橙色,其中0X 表示16进制,FF就是就是16进制中2位数的最大值,0XFF相当于100%的意思,669900就是三原色。然后这10000个像素点再交给cpu描绘,就成了图片了。

所以,如果能将bitmapdata保存起来,其实可以达到减少内存的浪费。

 

以下是我封装好的image类,包含了对bitmapdata的存储,和再利用

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.ImageLoader;
import org.eclipse.swt.widgets.Display;

/**
 * @author cr.wu
 * */
public class ImageFoctory {
	
	private static HashMap<String, ImageData> hm = new HashMap<String, ImageData>();
	/**
	 * 读取图片,并设置size
	 * */
	public static Image getImg(Display d,String path,int width,int height){
		ImageData data = hm.get(path);
		if(data == null){
			File file = new File(path);
			Image image ;
			if(path.contains("http")){
				image = getNetJPG(path);
			}else{
				if(!file.exists()){
					return null;
				}
				image = new Image(d, path);
			}
			
			data = image.getImageData();
			hm.put(path, data);
		}
		Image image  = new Image(d, data);
		return setSize(image,width,height);
	}
	public static Image getImg(String path,int width,int height){
		return getImg(Display.getCurrent(), path,width,height);
	}
	
	public static Image getImg(String path){
		return getImg( path,-1,-1);
	}
	/**
	 * 设置图片的大小?
	 * */
	public static Image setSize(Image image ,int width,int height){
		if(width == -1&&height == -1){
			return image;
		}
		if(height == -1){
			height = image.getImageData().height;
		}
		if(width == -1){
			width = image.getImageData().width;
		}
		Image imageNew = new Image(Display.getCurrent(), width, height);
		GC gc = new GC(imageNew); 
		gc.drawImage(image, 0, 0, image.getImageData().width, image.getImageData().height, 0, 0, width, height);
		gc.dispose();
		image.dispose();//原图片资源释
		return imageNew;
	}
	
	public static Display display(){
		return Display.getCurrent();
	}
	/**
	 * 获取网络上的图片
	 * */
	public static Image getNetJPG(String u){
		InputStream in = getNetJPGStream(u);
		Image image = new Image(display(), in);
		return image;
	}
	/**
	 * 获取jpg的流
	 * */
	public static InputStream getNetJPGStream(String u){
		URL url;
		InputStream inStream = null;
		try {
			url = new URL(u);

			// 打开链接
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			// 设置请求方式�?GET"
			conn.setRequestMethod("GET");
			// 超时响应时间�?�?
			conn.setConnectTimeout(5 * 1000);
			// 通过输入流获取图片数�?
			inStream = conn.getInputStream();
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return inStream;
	}
	/**
	 * 将流保存成图片,存到本地
	 * */
	public static void inputToNative(InputStream in ,String savePath){
		int format = checkPicFormat(savePath);
		ImageData data = null;
		Image image = new Image(display(), in);
		data = image.getImageData();
		image.dispose();
//		try {
////			in.close();
//		} catch (IOException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
		ImageLoader l = new ImageLoader();
		l.data = new ImageData[]{data};
		l.save(savePath, format);
	}
	/**
	 * 将网络图片存到本地
	 * */
	public static void netToNative(String netPath,String savePath,int[] size,int format){
		if(format == 0){
			format = checkPicFormat(netPath);
		}
		ImageData data = null;
		if(hm.get(netPath) == null){
			InputStream in = getNetJPGStream(netPath);
			Image image = new Image(display(), in);
			data = image.getImageData();
			image.dispose();
			try {
				in.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			hm.put(netPath, data);
		}else{
			data = hm.get(netPath);
		}
		if(size!=null){
			int width = data.width;
			int height = data.height;
			if(size[0] == 0){
				size[0] = width;
			}
			if(size[1] == 1){
				size[1] = height;
			}
			data = data.scaledTo(size[0], size[1]);
		}
		ImageLoader l = new ImageLoader();
		l.data = new ImageData[]{data};
		l.save(savePath, format);
		
		
	}
	/**
	 * 判断图片格式
	 * */
	public static int checkPicFormat(String path){
		if(path.length() == 0)return 0;
		int format = 0;
		String[] t = path.split("\\.");
		String formatStr = t[t.length - 1];
		if("jpeg".equals(formatStr)){
			format = SWT.IMAGE_JPEG;
		}else if("jpg".equals(formatStr)){
			format = SWT.IMAGE_JPEG;
		}else if("png".equals(formatStr)){
			format = SWT.IMAGE_PNG;
		}else if("bmp".equals(formatStr)){
			format = SWT.IMAGE_BMP;
		}else if("gif".equals(formatStr)){
			format = SWT.IMAGE_GIF;
		}else if("icon".equals(formatStr)){
			format = SWT.IMAGE_ICO;
		}
		return format;
	}
	
}


 

import java.io.File;
import java.io.InputStream;
import java.util.Date;

public class Simple {
	public final static String IMAGE = System.getProperty("user.dir")+File.separatorChar+"img"+ File.separatorChar;
	public final static String NET_PATH = "http://imgsrc.baidu.com/forum/w%3D580/sign=7ca61064472309f7e76fad1a420c0c39/4eb24a2442a7d933fb79e183ac4bd11372f00169.jpg";
	public final static String NET_TO_NATIVE_PATH = IMAGE + "net_to_native.jpg";
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		createFile(IMAGE,false);
		
		String netPath = NET_PATH;
		InputStream in = ImageFoctory.getNetJPGStream(netPath);//获取网络的图片
		String path = NET_TO_NATIVE_PATH;
		ImageFoctory.inputToNative(in, path);//保存到本地
		/**记录时间开始用来比较*/
		long t1 = new Date().getTime();
		ImageFoctory.getImg(path);
		long t2 = new Date().getTime();
		ImageFoctory.getImg(path);
		long t3 = new Date().getTime();
		ImageFoctory.getImg(path);
		long t4 = new Date().getTime();
		
		System.out.println("第 1 次读取图片时,消耗:        "+(t2 - t1)+"     毫秒");
		System.out.println("第 2 次读取图片时,消耗:        "+(t3 - t2)+"     毫秒");
		System.out.println("第 3 次读取图片时,消耗:        "+(t4 - t3)+"     毫秒");
		System.err.println("完成----------------");

	}
	
	public static void createFile(String path, boolean cover) {
		createFile(new File(path), cover);

	}
	/**
	 * 创建一个文件夹
	 * */
	public static  void createFile(File f, boolean cover) {
		if (cover) {
			System.out.println("fileUtil:覆盖。。" + f.getPath());
			f.mkdirs();
			return;
		}
		if (!f.exists()) {// 不存在则创建
			System.out.println("fileUtil:创建。。" + f.getPath());
			f.mkdirs();
		}
	}

}

 下附全套源码。。

如果有什么bug请留言,我会尽快修正,谢谢

 

分享到:
评论

相关推荐

    org.eclipse.swt.win32

    org.eclipse.swt.internal.gdip.BitmapData.class org.eclipse.swt.internal.gdip.ColorPalette.class org.eclipse.swt.internal.gdip.Gdip.class org.eclipse.swt.internal.gdip.GdiplusStartupInput.class org....

    BitmapData.draw方法

    总的来说,BitmapData.draw方法是Flash开发中非常强大的工具,它可以灵活地处理显示对象,实现丰富的视觉效果和高效的性能优化。在实际开发中,根据具体需求,结合其他相关技术,如Matrix和ColorTransform,可以实现...

    [转] BitmapData 基础部分2

    BitmapData是ActionScript 3(AS3)中的一个核心类,它是处理像素数据的主要工具,广泛应用于游戏开发、图像处理和动画制作等场景。在AS3中,BitmapData类允许我们创建、读取、修改和操作位图数据,这些位图数据可以...

    ActionScript 3 BitmapData 的例子

    BitmapData是ActionScript 3中的一个关键类,它提供了对位图图像进行低级处理的能力。本篇文章将深入探讨BitmapData类及其在实际应用中的示例。 1. BitmapData基础 BitmapData类允许开发者创建、加载和操作位图数据...

    BitmapData.pas和kbKernel.pas

    BitmapData.pas 和 kbKernel.pas 这两个文件在IT领域中主要涉及到图像处理和自动化操作,特别是游戏或图形应用中的找图找色功能。在本文中,我们将深入探讨这两个关键概念及其在实际编程中的应用。 首先,...

    BitmapData.zip

    BitmapData 是 Delphi 中用于表示位图数据的结构,它封装了 GDI+ 的 Bitmap 类,允许开发者直接访问图像的像素数据。通过 BitmapData,你可以访问图像的宽度、高度、格式(例如 RGB 或灰度),以及实际的像素数组。...

    Android bitmap工具类

    本篇文章将详细探讨`Android bitmap工具类`,特别是如何将Bitmap转换为String格式,以及这种转换在联网操作中的应用。 首先,我们来看Bitmap到String的转换过程。这个转换在Android中通常通过Bitmap的compress方法...

    使用C#的BitmapData

    在C#中,`BitmapData`类是用于高效地访问和操作位图图像像素的核心类。这个类在处理大量像素操作时尤其有用,因为它允许直接访问图像数据的内存缓冲区,而无需通过昂贵的属性访问。`BitmapData`提供了一种优化的方法...

    Flex 动态加载 Image 和 Icon 解决方案

    在实际项目中,这样的工具类通常包含一些静态方法,比如将 URL 转换为 `IconItem` 或者预加载一组 Icon 等。 总的来说,Flex 中动态加载 Image 和 Icon 是通过 `Loader` 类和相关的事件处理来实现的。通过合理的...

    flash image处理类库

    "Flash Image处理类库"是一个专门设计用于处理和操作图像的工具集,它为开发者提供了丰富的功能,便于在Flash环境中进行图像与字符间的转换。下面将详细探讨这个类库中的关键知识点。 1. 图像加载与显示: Flash中...

    [转]image[转换效果]

    在AS3中,这样的类通常会封装对BitmapData对象的操作,提供对像素级别的控制。 `Elastic.as`:这个名字暗示了一个弹性或橡皮筋效果的实现。在动画中,这种效果通常用来模拟物体的弹跳或者伸缩,使动画看起来更加...

    位图噪声效果BitmapData类的运用

    BitmapData类实例 运用噪声制作一些好的效果 源码

    delphi 找图找色 BitmapData.pas

    delphi 找图找色 BitmapData.pas 使用方法请到原作者yeye55的blog查看, http://yeye55blog.blog.163.com/blog/static/19724102120111043252016/

    [心得] draw的技巧,说说BitmapData(附源码)

    BitmapData是ActionScript 3(AS3)中的一个核心类,它是Adobe Flash Professional和Flex开发中的重要组成部分。这篇心得分享了关于使用BitmapData的一些高级技巧,以及如何利用它来提升图形绘制的效率和效果。...

    as3 Image effect源代码

    在提供的"Image Effect"压缩包中,可能包含不同种类的AS3图像效果源代码示例,你可以通过学习和分析这些代码来理解和实现各种视觉特效。通过深入理解这些概念和技术,你将能够为你的Flash项目增添更多创新和吸引力。

    Flex4视频教程_03-03使用Image组件.rar

    - 使用Loader类:如果需要更精细的控制,例如处理加载进度,可以使用`flash.display.Loader`类先加载图像,然后将加载的BitmapData对象赋值给Image组件的`bitmapData`属性。 4. **图像缩放和对齐**: - 缩放策略...

    Flex RIA AS3网页游戏 BitmapData CopyPixel用法.rar

    这个压缩包"Flex RIA AS3网页游戏 BitmapData CopyPixel用法.rar"显然包含了关于如何在AS3中使用BitmapData的CopyPixel方法来创建或修改位图的示例和教程。 BitmapData对象是AS3中表示位图图像的数据结构,它可以...

    flex 图片操作

    如果需要更复杂的操作,如裁剪、缩放、颜色转换等,可能需要借助ActionScript的`BitmapData`类。通过加载图片到`BitmapData`对象,我们可以直接操作像素数据,实现各种高级效果。例如: ```as var bitmapData:...

Global site tag (gtag.js) - Google Analytics