图片资源管理

在eclipse插件开发的时候,很多地方都需要用到图片之类的资源,而在SWT中图片资源是需要手动释放的。虽然操作不难,但是手动释放时机却很难把握,尤其是图片可能被多个地方用到的时候。在网上看了一个帖子:

http://southking.iteye.com/blog/316449对资源的解释还是蛮详细的,但是也没有提供一个简单的图片管理实现。这里把自己的简单实现图片资源管理的代码贴出来:

 

public static ImageDescriptor findImageDescriptor(String path)
    {
        final IPath p = new Path(path);
        if (p.isAbsolute() && p.segmentCount() > 1)
        {
            return AbstractUIPlugin.imageDescriptorFromPlugin(p.segment(0), p.removeFirstSegments(1).makeAbsolute()
                    .toString());
        } else
        {
            return getBundledImageDescriptor(p.makeAbsolute().toString());
        }
    }
 

private static ImageDescriptor getBundledImageDescriptor(String path)
    {
        return AbstractUIPlugin.imageDescriptorFromPlugin(PLUGIN_ID, path);
    }
 

public Image getBundledImage(String path)
    {
        Image image = getImageRegistry().get(path);
        if (image == null)
        {
            getImageRegistry().put(path, getBundledImageDescriptor(path));
            image = getImageRegistry().get(path);
        }
        return image;
    }
 

上述是加载插件里面的图片资源,位置也是相对当前插件工程的。

 

下面贴一点其他的:

1.使用Image(Device device, InputStream stream)构造函数,示例代码如下, path为图像相对路径:

 

如下是官方提供的例子:

 

static Image loadImage (Display display, Class clazz, String string) {
          InputStream stream = clazz.getResourceAsStream (string);
          if (stream == null) return null;
          Image image = null;
          try {
               image = new Image (display, stream);
          } catch (SWTException ex) {
          } finally {
               try {
                    stream.close ();
               } catch (IOException ex) {}
          }
          return image;
     }
 

如下是我自己的实现:

 

/**
     * 
     * @param file 传入的对象必须为图片对象
     * @return
     * @throws CoreException
     */
    public static Image getImage(IFile file) throws CoreException
    {
        if (file == null || file.exists())
        {
            return null;
        }

        Image image = JFaceResources.getImage(file.toString());
        if (image == null || image.isDisposed())
        {
            image = new Image(Display.getCurrent(), file.getContents());
            JFaceResources.getImageRegistry().put(
                    file.getFullPath().toOSString(), image);
        }
        return image;
    }
 

2.使用ImageDescriptor的createImage()方法,示例代码如下,path为图像相对路径:

 

private Image getImage(String path){
  URL url = null;
  try{
   url = new URL(Activator.getDefault().getDescriptor().getInstallURL(), path);
  }catch(MalformedURLException e){
   e.printStackTrace();
  }
  ImageDescriptor imageDescriptor = ImageDescriptor.createFromURL(url);
  return imageDescriptor.createImage();
 }
 

private Image getImage(String path){
   ImageDescriptor desc = AbstractUIPlugin.imageDescriptorFromPlugin(ID, path);
   return desc.createImage();
}
 

 

 

你可能感兴趣的:(管理)