-
2021-03-14 04:26:39
如下代码,使用getResourceAsStream返回jar中文件的InputStream流:
Image img = null;
try {
MediaTracker m = new MediaTracker(this);
InputStream is = getClass().getResourceAsStream("image.gif");
//
// if your image is in a subdir in the jar then
// InputStream is = getClass().getResourceAsStream("img/image.gif");
// for example
//
BufferedInputStream bis = new BufferedInputStream(is);
// a buffer large enough for our image
//
// can be
// byte[] byBuf = = new byte[is.available()];
// is.read(byBuf); or something like that...
byte[] byBuf = = new byte[10000];
int byteRead = bis.read(byBuf,0,10000);
img = Toolkit.getDefaultToolkit().createImage(byBuf);
m.addImage(img, 0);
m.waitForAll();
}
}
catch(Exception e) {
e.printStackTrace();
}
更多相关内容 -
Android动态加载外部jar包及jar包中图片等资源文件
2021-06-05 00:54:26Android动态加载外部jar包及jar包中图片等资源文件Android应用程序由Java开发,因此Java中许多实用的特性,在Android中也有体现。动态加载Class,也就是外部jar包,在Java中简单的方法就是在项目的Bulid Path中导入...Android动态加载外部jar包及jar包中图片等资源文件
Android应用程序由Java开发,因此Java中许多实用的特性,在Android中也有体现。动态加载Class,也就是外部jar包,在Java中简单的方法就是在项目的Bulid Path中导入jar,然后就可以使用jar包中的Class文件,这些,都需要java虚拟机的支持。
Android的虚拟机与java虚拟机有区别。所以在动态加载jar包上面有区别。简单来说就是android的虚拟机不能识别jar包,需要将jar包转换为可识别的dex文件(android系统可执行文件)。
Android中动态加载jar包的类,使用DexClassLoader来实现。
Jar包中可以打进android项目res文件夹下的资源文件,android中亦可以对jar包中的资源文件进行加载。
Android中加载jar包中的如txt,png等文件,使用JarFile类进行。
2.制作jar包,转换为dex文件
使用面向接口编程:
2.1写好功能接口与接口的实现。
2.2将接口打成IDynamic.jar,将接口实现打成Dynamic.jar
面向接口编程,调用jar包的项目导入接口的jar包,接口实现的jar包放在项目外部,用于调用。
2.3将功能接口的实现类的jar包转为dex文件
1) 将Dynamic.jar复制到adt-bundle-windows-x86-20131030\sdk\build-tools\android-4.4,将jar包转为android识别的dex文件。
2) 进入cmd,cd到上面的目录,执行命令:
dx --dex --output = Dynamic_temp.jar Dynamic.jar
Dynamic_temp.jar是要生成的dex包。
注:jar包中可以将res中的资源打包进去。
3.使用jar包,动态加载。
1. 将接口实现类的jar包Dynamic_temp.jar导入到模拟器的sd卡上,为了方便,直接导入根目录下。
2. 将接口IDynamic.jar导入需要调用的项目中。
3.1动态加载jar包中的Class,例子是在activity中:
//动态加载类的接口
private IDynamic lib = null;
// android可执行class加载器
private DexClassLoader c1;
//动态加载外部(sd卡中)jar包的路径
privateString jarPath;
// jar解压路径,jar包中的dex文件会被解压缩
privateString jarOutputPath;
jarPath = Environment.getExternalStorageDirectory()
.toString() + File.separator + "dynamic_temp.jar";
jarOutputPath = Environment.getExternalStorageDirectory()
.toString() + File.separator + "ExtendJar";
//定义DexClassLoader
//第一个参数:是dex压缩文件的路径
//第二个参数:是dex解压缩后存放的目录
//第三个参数:是C/C++依赖的本地库文件目录,可以为null
//第四个参数:是上一级的类加载器
c1 = new DexClassLoader(jarPath, jarOutputPath, null, getClassLoader());
try {
Class> dynamic = c1
.loadClass("com.dynamic.interfacesImpl.Dynamic");
lib = (IDynamic) dynamic.newInstance();
if (lib != null) {
lib.init(MainActivity.this);
}
} catch (Exception e) {
e.printStackTrace();
}
在按钮的点击事件中调用jar中的方法:
public void onClick(View arg0) {
lib.showToast();
}
3.2动态加载jar包中的资源:图片、文本等
将jar包中打入资源文件,例子中是res/drawable-mdpi/ic_launcher.png,及jar自带的META-INF/MANIFEST.MF文件。
3.2.1解析jar包中的文本文件:
Button btn4 = (Button) findViewById(R.id.btn4);
btn4.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
JarFile jarfile;
InputStream is;
try {
jarfile = new JarFile(jarPath);
is = jarfile.getInputStream(jarfile
.getEntry("META-INF/MANIFEST.MF"));
StringBuffer out=new StringBuffer();
byte[] b=new byte[4096];
for (int n; (n = is.read(b)) != -1;) {
out.append(new String(b, 0, n));
}
TextView txt = (TextView) MainActivity.this
.findViewById(R.id.textView);
txt.setText(out.toString());
is.close();
} catch (IOException e) {
//TODOAuto-generated catch block
e.printStackTrace();
}
}
});
将从jar包中读出的文本文件,以inputStream流的形式读出,再输出。
3.2.2 解析jar包中的图片
将jar包中的图片以inputStream流的形式读出,再将inputStream流转为bmp图片对象,进行使用。
Button btn3 = (Button) findViewById(R.id.btn3);
btn3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
//TODOAuto-generated method stub
JarFile jarfile;
InputStream is;
try {
jarfile = new JarFile(jarPath);
is = jarfile.getInputStream(jarfile
.getEntry("res/drawable-mdpi/ic_launcher.png"));
/*
*将inputStream流转为bmp对象
*/
Bitmap bmp = BitmapFactory.decodeStream(is);
ImageView img = (ImageView) MainActivity.this
.findViewById(R.id.img);
img.setImageBitmap(bmp);
is.close();
} catch (IOException e) {
//TODOAuto-generated catch block
e.printStackTrace();
}
}
});
效果图
http://wenku.baidu.com/link?url=a_7Mz0z7EWH3JkCkqc4rFpivzkDsFVIyr-smsDqyoeAAJq4x_w4QOllzNoJp4OxjEnSmCVnGA-NAfkMdu1lWK6ahc7nI-RU3nlTOfATk58u
-
jar包中图片加载出错解决方案
2020-03-16 21:25:29jar包中图片加载出错解决方案问题:图片加载报错解决方案:使用**InputStream**提升:这样写为什么可以?展示:这里展示下我做的jar包(一个简单的过场动画)源码:java代码及图片 如果你对eclipse中加载图片不太...如果你对eclipse中加载图片不太熟悉的话,恭喜你,看到了这篇文章。
问题:图片加载报错
这个问题其实很简单,因为jar包其实是一种压缩形式,你并不能通过
File
直接从中读到信息。解决方案:使用InputStream
//创建马里奥图片的inputstream对象 InputStream ma = this.getClass().getResourceAsStream("/mario_g.png"); //创建路易吉图片的inputstream对象 InputStream lu = this.getClass().getResourceAsStream("/luigi_g.png"); //使用ImageIO.read()方法直接读取成BufferedImage对象 BufferedImage marioBufferedImage = ImageIO.read(ma); BufferedImage luigiBufferedImage = ImageIO.read(lu); //如果你需要的是Image对象的话,只需要强转一下就行了。这里使用BufferedImage因为他可以比较方便的改变图片的大小。 Image marioImage = (Image)marioBufferedImage;
上面使用的路径,为src的相对路径。
提升:这样写为什么可以?
我们这个
this.getClass().getResourceAsStream
显然是从.class文件所在目录中获取文件的,为什么我前面说只要写src的相对路径就行呢?首先,我们需要明白的是,eclipse在编译的时候,会将src目录下的文件和.java文件一并编译到bin目录下保持不变,而.java文件则被编译成了.class文件。
这样你是不是明白了?咱们获取的的确不是src下的文件,但是bin下的确也有这个文件就是了。
你现在是不是想着把图片放到bin目录下,是不是少放在src下一次,还要更精简一些呢?
然而并不是,首先,你本次运行还是没问题的,因为你bin目录下的确有你放入的文件。但是,只要你修改了java代码,eclipse一重新编译class文件,哼哼,你src目录下没有的,bin目录下也就木大木大啦!而且你这样的话导出成jar包的时候里面会没有你的资源文件。。。
那么这里再稍微讲下如何导出jar包吧,
右键项目 -> Java -> JAR file -> Next -> 在 Select the export destination 下点 Browse.. 选一个路径 -> finish
这样你就可以得到一个jar包了,里边只有编译好的class文件嘛,所以相对应的路径,就应该取class文件所在的路径咯,这也是你jar包文件取不到的原因。
言归正传,你可能会想,取class文件所在路径,用
this.getClass().getResource("/").getFile()
不行吗?然后用得到的字符串,去新建一个File
对象,也是在bin里取图片啊,为啥不行?这就要涉及到读取文件的方式了,
InputStream
读取方式,是将图片转换成流数据来读取,就好像是文件肚子里的蛔虫。而File
的读取方式是先找到文件,再读取,就好像是侦探通过线索来找你。而导出成jar包侦探就找不到你了吗?还真找不到了!因为前面也说了,jar包是一种压缩文件的形式,他是一个文件,不是一个路径,就好像你藏在了一个人的梦里,而侦探又不是什么神仙,怎么可能从别人的梦里找到你?这个解答满意否?下面再顺便讲讲使用jar包吧,很简单,在项目下新建一个
lib
目录,然后把你生成的jar包拖进去,右键它,点Build Path -> Add To Build Path
就行了,你就可以创建jar包里的类的对象来使用它的方法了。展示:这里展示下我做的jar包(一个简单的过场动画)
源码:java代码及图片
这是创建jar包前的源码,创建jar包的时候可以把
public class
去掉。import java.awt.Container; import java.awt.Graphics; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.InputStream; import java.net.URISyntaxException; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JPanel; @SuppressWarnings("serial") public class GuoChangTest extends JFrame{ public GuoChangTest(String title) throws IOException, InterruptedException, URISyntaxException { JFrame jf = new JFrame(title); Container conn = jf.getContentPane(); //得到窗口的容器 DrawGuoChang guochang = new DrawGuoChang(790,580); conn.add(guochang); jf.setBounds(300,80,800,600); //设置窗口的属性 窗口位置以及窗口的大小 jf.setVisible(true);//设置窗口可见 jf.setDefaultCloseOperation(DISPOSE_ON_CLOSE); //设置关闭方式 如果不设置的话 似乎关闭窗口之后不会退出程序 guochang.run(); } public static void main(String[] args) throws IOException, InterruptedException, URISyntaxException { new GuoChangTest("过场动画测试"); //创建窗口 } } @SuppressWarnings("serial") class DrawGuoChang extends JPanel{ private int width; private Image marioImage; private Image luigiImage; private int imgWidth; private int imgHeight; private int t; public DrawGuoChang(int width,int height) throws IOException, URISyntaxException { this.width = width; InputStream ma = this.getClass().getResourceAsStream("/mario_g.png"); InputStream lu = this.getClass().getResourceAsStream("/luigi_g.png"); BufferedImage marioBufferedImage = ImageIO.read(ma); BufferedImage luigiBufferedImage = ImageIO.read(lu); imgHeight = height/6; double scale = imgHeight/(double)marioBufferedImage.getHeight(); imgWidth = (int) (marioBufferedImage.getWidth()*scale); this.marioImage = marioBufferedImage.getScaledInstance((int) imgWidth, imgHeight, Image.SCALE_DEFAULT); this.luigiImage = luigiBufferedImage.getScaledInstance((int) imgWidth, imgHeight, Image.SCALE_DEFAULT); } public void run() throws InterruptedException { t=0; while(true) { t++; Thread.sleep(20); super.repaint(); if(t==-1) { return; } } } protected void paintComponent(Graphics g) { int xm,xl=1; for(int i=0;i<3;++i) { if(t>=0) { xm=-100-imgWidth+t*10; xl=100+width-t*10; }else { xm=-100-imgWidth; xl=100+width; } g.drawImage(marioImage, xm, imgHeight*i*2, null); g.drawImage(luigiImage, xl, imgHeight*i*2+imgHeight, null); } if(xl<=0) { t=-40; } } }
图片是我自己网上找的图片然后ps做的。
mario_g.png
luigi_g.png -
npm包中有图片等资源时无法加载
2022-03-20 01:30:35引用依赖包时无法加载图片等资源前言
上文中讲到将组件A进行打包发布了,但是在项目B中进行使用时发现图片加载不出来,查看图片的路径发现了问题所在,下面将详细分析图片加载不出来的原因和解决方案。
组件A中图片路径
在组件A中使用到的图片会被打包进build文件夹下的img文件夹中
项目B中使用
但是在项目B中使用时发现图片无法加载,查看路径发现路径错乱,根本加载不到资源
解决方案
于是想到在项目B中使用时,由于引用的是组件A的打包后的包,就是js文件,所以引用图片的路径变为在js路径下,但是项目B打包后包的js文件夹下根本没有此路径,所以无法加载到这个图片。根据此问题可提供以下解决方案:
- 图片不大时,可将图片转为base64形式使用。但是在图片很多时可能会影响性能,图片很大时也可能无法转化。
- 将图片资源放在线上服务器上,引用图片路径时使用绝对路径。
- 将图片资源放在每个项目的静态文件夹中,每个项目单独维护图片资源。
- 在引用组件A时,也可以再引入一下图片资源,这样就可以访问到图片路径了,此方案为娱乐方案。
前三种方案在网上都可以搜到,使用也很简单,下面讲一下方案4,此方案仅供娱乐。
娱乐方案
在项目B中的node_modules中可以看到能拿到组件A中的图片资源,此时可以把图片文件夹复制到项目B的静态文件夹中中,通过copy-webpack-plugin插件可以打包到项目B包中,项目B打包后即可正常访问图片。这种方法和方案3类似了。
还有一种方法,就是直接引入图片,也可以通过打包将图片资源放到正确位置。需要配置一下vue.config.jsimport ‘…/node_modules/zy-testtt/build/img/2003472.9edbef.jpg’
const path = require('path') module.exports = { chainWebpack: config => { // 为啥是images呢?可以通过审查项目 vue inspect > output.js输出到文件中,搜image就懂了 const urlLoader = config.module.rule('images') // 清除已有的所有 loader,一定要进行的操作 // 如果你不这样做,接下来的 loader 会附加在该规则现有的 loader 之后 // 具体原理可自行查看webpack官网 urlLoader.uses.clear() urlLoader .test(/\.(png|jpe?g|gif|svg)(\?.*)?$/) .use('url-loader') .loader('url-loader') .options( { limit: 1024*1, // 1k name:'js/img/[name].[ext]', fallback: 'file-loader', // 当超过1024byte时,会回退使用file-loader context: path.resolve(__dirname,'./src'), publicPath: '/' //采用根路径 }) }, }
vue.config.js中的配置从网上某个博客中拿过来的,忘了是哪个博客了。
从上图可看到图片可以正常加载了,ok,娱乐结束,认真了,有好的方案的话欢迎留言,想学习! -
ueditor编辑器 war包中图片上传问题 @Hqy
2018-03-05 18:12:00ueditor编辑器 在tomcat下运行与war运行时,tomcat下的图片上传时会自动获取tomcat下的文件夹目录,将上传的图片写入文件夹。 我们的程序是war包运行的,图片无法写入war包,只能把图片放在外边,为解决此... -
ReactNative坑之记录——drawable包中图片有问题
2017-09-06 22:22:09init初始化没问题,但是新建了一个drawable包将图片放进去以后就显示报错不能安装 解决 :包中图片有个有问题,等老师上课说,先将需要用的图标放进去 -
[Unity][AssetBundle]加载并复制AB包中的Texture2D图片
2020-11-26 20:38:10加载AB包,之后,由于图片全部在一个AB包中,将AB包卸载就会使得 从AB包加载的图片 失效,为空。 先确保 要打包 的图片的Read/Write Enable为 勾选状态。 用代码批量处理 当前项目工程 中的 所有 .png图片 ,... -
读取jar包中图片文件,并转换为BufferImage
2015-06-26 14:40:50jar包中的资源读取不到,真心难过,后来发现可以通过流的方式把资源读取出来(包括.class本身) //读取jar包中的资源,但是读到的是InputStream InputStream is=this.getClass().getResourceAsStream("/Plugin/... -
jar包中图片的正确显示及第三方jar包的引用
2013-10-23 19:18:37程序中要显示图片,而且还要使用MySQL的JDBC Driver类,将mysql-connector-java-5.1.8-bin.jar和需要的图片文件夹pic加入工程中,但图片不能正常显示,并 且数据库连接失败。 先解决图片的问题。图片的显示有两种... -
如何读取jar包中的图片?
2021-03-14 02:05:58如何读取jar包中的图片?一、首先,在eclipse中正常读取图片(用swing图形界面来测试)。1、目录结构如下图所示: test为工程名,测试类为photo.ReadTest,图片文件为img\test.png。2、代码如下所示:packagephoto... -
从bag包中提取图片和点云数据
2020-10-18 13:49:25之前录了一些激光雷达点云数据以及双目相机的图像数据,需要从bag包中提取出来,以便后续使用。 bag中提取点云 bag中提取点云数据 bag中提取图片 查看bag信息 rosbag info yourname.bag 可以看到如下图bag包信息: ... -
怎么能修改Jar包中的内容
2020-10-12 12:23:48在做(或修改别人的)项目的时候,可能遇到要修改调用的的jar包内的类属性或方法的问题。在eclipse或是其他的IDE中是无法直接修改的,所以需要一个解压jar-->修改文件-->编译-->打包成jar文件的过程,下面... -
rosbag解包,保存图片
2020-11-23 21:51:21新建一个文件夹(建立result文件夹),图片会保存在该文件夹下,在该文件下运行命令: (这里保存的是jpg格式图片) rosrun image_view extract_images _sec_per_frame:=0.01 image:=/camera/color/image_raw 根据... -
java项目打成jar包后,图片不显示等情况
2020-12-24 20:32:03原因:由于存放的图片的路径可能是在src外面的。这样子,打包成jar包之后,类中访问的路径是需要到src下找资源。这时候就出现找不到图片的情况。 如: 这里提供几种解决方案... -
jar包及jar包中图片加载
2010-05-10 23:35:00jar cvf *.jar *.class *.jpg打好jar包后 1. 若要jar包可打开执行,则改动jar... 对于加载图片,见:转载(1)你将所有资源打包为andy.jar,你的类位于一个包中:package andycpp;你的图片资源全部放在images文件夹中 -
读取jar包中的图片,文本, 文本会写到控制台,图片会输出到F:盘中
2017-07-03 15:53:38读取jar包中的图片,文本, 文本会写到控制台,图片会输出到F:盘中 -
AssetBundle(三)——加载AB包中资源的方法
2019-03-25 12:25:15一:同步加载其中一个资源 T objectFromBundle=assetBundle.LoadAsset<T>(string assetName) 二:同步加载所有资源 T[]objectsFromBundle=assetBundle.LoadAllAssets<T>...三:异步加载其中一个资源 ... -
从bag包中提取图片和点云数据为pcd格式点云文件
2021-05-07 14:17:55从bag包中提取图片和点云数据为pcd格式点云文件1 开始提取bag包之前的准备工作2 从bag包中提取图片和点云数据 首先说明一下我运行的系统环境: python2 Ubuntu18.04 ROS melodic 1 开始提取bag包之前的准备工作 ... -
使用eclipse平台jar包中的图片
2021-12-14 16:49:08public class Activator { ... public ImageDescriptor getImage(String path){ return ResourceLocator.imageDescriptorFromBundle(PLUGIN_ID,path).orElse(null); } public static void main(String[] args) ... -
Android Jar包中使用图片资源
2019-09-16 07:44:21为解决此问题,在AppActivity的基类Cocos2dxActivity的init时,显示一张背景图片即可。 由于Cocos2dxActivity位于classes.jar中,所以无法通过R.drawable.xxx来访问项目res/drawable中的资源。为解决此问题,... -
cocos2d图片资源解密
2019-08-27 18:18:34根据经验和查找资料,cocos2dx的图片资源加载, 是在Image::initWithImageData(const unsigned char * data, ssize_t dataLen)函数;打开libcocos2djs.so,搜索这个函数可以看到解密就在这个地方 可以看到,通过... -
[Java] 如何访问jar包中的静态资源(如html、css、图片等)
2021-08-02 17:04:06这句话的意思是 只要你把资源文件放到jar包中的 /META-INFO/resources目录下,启动项目时,这个目录下的资源文件是可以直接访问的。 这里可能会有这几个疑问: 【1】问:/META-INF/resources 目录要在哪里创建? 答... -
读取jar包中的图片,,如下代码,使用getRe
2021-04-15 19:19:43读取jar包中的图片,,如下代码,使用getRe如下代码,使用getResourceAsStream返回jar中文件的InputStream流:Image img = null;try { MediaTracker m = new MediaTracker(this); InputStream is = getClass().... -
在Jar中读取Jar包中的资源(文本、图片等文件)
2021-03-13 15:24:10我们常常在代码中读取一些资源文件(比如图片,音乐,文本等等)。在单独运行的时候这些简单的处理当然不会有问题。但是,如果我们把代码打成一个jar包以后,即使将资源文件一并打包,这些东西也找不出来了。这段代码... -
读取ros包中rgb和depth图,python代码
2020-11-05 14:28:36可以将ros包中的颜色图和深度图读取出来,并保存到对应文件夹下。 使用时仅需要修改对应话题和路径即可。 -
cocos2dx 图片资源加密解密
2019-01-25 00:43:13下面就和大家来共享一下cocos2dx 图片资源加密解密的方法,如果对这个方法有疑问或者完善可以到社区里面发帖,来和大家一起进行交流和学习,社区里也会不断的来更新这方面的内容,和大家一起来交流做使用过程中遇到... -
Apk2Jar:Build android‘s layout drawable to jar 构建Android布局、图片资源到jar包中 用来封装带界面的...
2021-05-08 22:39:21构建Android布局,图片资源到jar包中; 做成封装带界面的罐包SDK(如:游戏sdk); 执照 Copyright (C) 2015 seven456@gmail.com Licensed under the Apache License, Version 2.0 (the "License"); you may not use...