关于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....
最近要转开发平台,正研究C#。C#好是好,不过处理图片时一个像素一个像素的操作像素不是一般的慢。其实Delphi也一样,但好在Delphi的Bitmap类提供了ScanLines,可以一行一...经过一番搜索,终于发现了C# BitmapData类。
ActionScript 3 BitmapData 的例子 有助于你了解ActionScript 3位图!
想把 draw方法弄明白
NULL 博文链接:https://as3.iteye.com/blog/964080
delphi 找图找色 BitmapData.pas 使用方法请到原作者yeye55的blog查看, http://yeye55blog.blog.163.com/blog/static/19724102120111043252016/
BitmapData类实例 运用噪声制作一些好的效果 源码
位图数据处理,主要用于位图的找图找色:BitmapData.pas 實現按键精靈的功能:kbKernel.pas
EaselJS的位图数据EaselJS的BitmapData将AS3(例如BitmapData)添加到EaselJS。例1 // create BitmapData by HTMLImageElement_bmd01 = new createjs.BitmapData(HTMLImageElement);_bitmap01 = new createjs.Bitmap...
和强大BitmapData类,让您可以控制的所有方面的形象。此外,您将了解新技术和像素本德尔如何您可以使用它来创建自定义过滤器和混合模式为内容,通过着色。 最后,这本书教您可以如何利用ActionScript打破在Flash ...
一个delphi下用于快速找图找色的单元,很好用!!! 原下载地址已经全部失效,在这里分享给大家,希望使用delphi的朋友能够喜欢。
as2.0 模拟火焰 import flash.display.*...var blueSpot: BitmapData = new BitmapData( clipBounds.xMax, clipBounds.yMax, true, 0 ) blueSpot.draw( blueSpotClip, new Matrix() ) blueSpotClip.removeMovieClip()
王者找图对比程序,delphi制作,设定一个图,找另一个图上是否有这个图!
NULL 博文链接:https://kinglong.iteye.com/blog/1609379
Flex RIA AS3网页游戏 BitmapData CopyPixel用法.rar
和强大BitmapData类,让您可以控制的所有方面的形象。此外,您将了解新技术和像素本德尔如何您可以使用它来创建自定义过滤器和混合模式为内容,通过着色。 最后,这本书教您可以如何利用ActionScript打破在Flash ...
和强大BitmapData类,让您可以控制的所有方面的形象。此外,您将了解新技术和像素本德尔如何您可以使用它来创建自定义过滤器和混合模式为内容,通过着色。 最后,这本书教您可以如何利用ActionScript打破在Flash ...
这是一个定义文件,用于将 BitmapData 类用于 CreateJS 和 TypeScript。 如何使用 是定义文件体。 请从 TypeScript 程序中读取并使用它。 请注意,单独使用此文件是行不通的,并且需要确定类型的画架。
本文主要通过彩色图象灰度化来介绍C#处理数字图像的3种方法,Bitmap类、BitmapData类和Graphics类是C#处理图像的的3个重要的类。 Bitmap只要用于处理由像素数据定义的图像的对象,主要方法和属性如下: ...