关于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.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方法是Flash开发中非常强大的工具,它可以灵活地处理显示对象,实现丰富的视觉效果和高效的性能优化。在实际开发中,根据具体需求,结合其他相关技术,如Matrix和ColorTransform,可以实现...
BitmapData是ActionScript 3(AS3)中的一个核心类,它是处理像素数据的主要工具,广泛应用于游戏开发、图像处理和动画制作等场景。在AS3中,BitmapData类允许我们创建、读取、修改和操作位图数据,这些位图数据可以...
BitmapData是ActionScript 3中的一个关键类,它提供了对位图图像进行低级处理的能力。本篇文章将深入探讨BitmapData类及其在实际应用中的示例。 1. BitmapData基础 BitmapData类允许开发者创建、加载和操作位图数据...
BitmapData.pas 和 kbKernel.pas 这两个文件在IT领域中主要涉及到图像处理和自动化操作,特别是游戏或图形应用中的找图找色功能。在本文中,我们将深入探讨这两个关键概念及其在实际编程中的应用。 首先,...
BitmapData 是 Delphi 中用于表示位图数据的结构,它封装了 GDI+ 的 Bitmap 类,允许开发者直接访问图像的像素数据。通过 BitmapData,你可以访问图像的宽度、高度、格式(例如 RGB 或灰度),以及实际的像素数组。...
本篇文章将详细探讨`Android bitmap工具类`,特别是如何将Bitmap转换为String格式,以及这种转换在联网操作中的应用。 首先,我们来看Bitmap到String的转换过程。这个转换在Android中通常通过Bitmap的compress方法...
在C#中,`BitmapData`类是用于高效地访问和操作位图图像像素的核心类。这个类在处理大量像素操作时尤其有用,因为它允许直接访问图像数据的内存缓冲区,而无需通过昂贵的属性访问。`BitmapData`提供了一种优化的方法...
在实际项目中,这样的工具类通常包含一些静态方法,比如将 URL 转换为 `IconItem` 或者预加载一组 Icon 等。 总的来说,Flex 中动态加载 Image 和 Icon 是通过 `Loader` 类和相关的事件处理来实现的。通过合理的...
"Flash Image处理类库"是一个专门设计用于处理和操作图像的工具集,它为开发者提供了丰富的功能,便于在Flash环境中进行图像与字符间的转换。下面将详细探讨这个类库中的关键知识点。 1. 图像加载与显示: Flash中...
在AS3中,这样的类通常会封装对BitmapData对象的操作,提供对像素级别的控制。 `Elastic.as`:这个名字暗示了一个弹性或橡皮筋效果的实现。在动画中,这种效果通常用来模拟物体的弹跳或者伸缩,使动画看起来更加...
BitmapData类实例 运用噪声制作一些好的效果 源码
delphi 找图找色 BitmapData.pas 使用方法请到原作者yeye55的blog查看, http://yeye55blog.blog.163.com/blog/static/19724102120111043252016/
BitmapData是ActionScript 3(AS3)中的一个核心类,它是Adobe Flash Professional和Flex开发中的重要组成部分。这篇心得分享了关于使用BitmapData的一些高级技巧,以及如何利用它来提升图形绘制的效率和效果。...
在提供的"Image Effect"压缩包中,可能包含不同种类的AS3图像效果源代码示例,你可以通过学习和分析这些代码来理解和实现各种视觉特效。通过深入理解这些概念和技术,你将能够为你的Flash项目增添更多创新和吸引力。
- 使用Loader类:如果需要更精细的控制,例如处理加载进度,可以使用`flash.display.Loader`类先加载图像,然后将加载的BitmapData对象赋值给Image组件的`bitmapData`属性。 4. **图像缩放和对齐**: - 缩放策略...
这个压缩包"Flex RIA AS3网页游戏 BitmapData CopyPixel用法.rar"显然包含了关于如何在AS3中使用BitmapData的CopyPixel方法来创建或修改位图的示例和教程。 BitmapData对象是AS3中表示位图图像的数据结构,它可以...
如果需要更复杂的操作,如裁剪、缩放、颜色转换等,可能需要借助ActionScript的`BitmapData`类。通过加载图片到`BitmapData`对象,我们可以直接操作像素数据,实现各种高级效果。例如: ```as var bitmapData:...