当前位置:首页 » 安卓系统 » android本地图片显示

android本地图片显示

发布时间: 2023-03-06 19:17:04

‘壹’ androidcanvas保存为图片部分不显示

canvas保存到本地图片三种方法
canvas保存本地图片
第一种方法(修改图片的媒体类型,window.open直接下载)
第二种方法(创建a标签,通过自己触发点击来下载)
第三种方法(将图片数据转换成Blob数据,可以保存大图片)
canvas保存本地图片
在公司做一个canvas的项目,遇到个需求 :将canvas保存为图片,图片尺寸为12000*4000,一共用了好几种方法,最后才成功,特此记录一下。

第一种方法(修改图片的媒体类型,window.open直接下载)
我看了一些教程,这种方法直接修改image.src最前面的媒体类型,将data:image改为data:application/octet-stream,然后调用window.open(url)这个函数,浏览器直接将会下载这个保存的图片。不过图片大小一旦超过限制,就会下载出现网络错误

// 第一种方法 采用data:application/octet-stream ,让浏览器识别为下载,有大小限制,12000*4000无法保存let image = new Image();image.src = canvas.toDataURL({format: 'image/png', quality:1, width:14000, height:4000});var url = image.src.replace(/^data:image\/[^;]/, 'data:application/octet-stream');return image;window.open(url);
第二种方法(创建a标签,通过自己触发点击来下载)
// 第二种 方法一样,无法保存较大的图片,会出现错误var imgURL = canvas.toDataURL({format: "image/png", quality:1, width:12000, height:4000});var dlLink = document.createElement('a');dlLink.download = "fileName";dlLink.href = imgURL;dlLink.dataset.downloarl = [MIME_TYPE, dlLink.download, dlLink.href].join(':');document.body.appendChild(dlLink);dlLink.click();document.body.removeChild(dlLink);
第三种方法(将图片数据转换成Blob数据,可以保存大图片)
这个方法的核心是将图片的imgData转换成Blob数据,然后通过a标签触发保存,可以存储较大的图片,刚好满足我的需求。

var link = document.createElement("a");var imgData =canvas.toDataURL({format: 'png', quality:1, width:20000, height:4000});var strDataURI = imgData.substr(22, imgData.length);var blob = dataURLtoBlob(imgData);var objurl = URL.createObjectURL(blob);link.download = "grid1.png";link.href = objurl;link.click();function dataURLtoBlob(dataurl: string) {var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);while(n--){u8arr[n] = bstr.charCodeAt(n);}eturn new Blob([u8arr], {type:mime});}
相关文章:
vue 引入项目图片的几种方式
MarkDown添加图片的三种方式
java代码读取图片的两种方式
ecilpse写html图片,eclipse怎么导入图片
移动端图片上传的两种方式
html 如何给图片打标签,图文详解HTML页面中添加图片的三种方法
python OpenCV 图片相似度 5种算法
word涂改涂掉图片_怎么在word中修改图片的两种方法
图种制作方法 vbs脚本
【安全技术揭秘系列】探索图片隐写的奥秘
图种
Qt线程池
线程池专栏
SpringBoot线程池
Java Review - 创建线程和线程池时建议指定与业务相关的名称
java线程池存在时间_Java线程池基础
tomcat线程池
Netty 线程池
线程池-ThreadPoolExecutor
Executors类创建四种常见线程池

‘贰’ 求:android 获取系统相册图片并显示在当前页面的代码

先初始化;

注意自定义 的

private final String IMAGE_TYPE = "image/*";private final int IMAGE_CODE = 0;


private void setImage() {
Intent getAlbum = new Intent(Intent.ACTION_GET_CONTENT); getAlbum.setType(IMAGE_TYPE); startActivityForResult(getAlbum, IMAGE_CODE);}
这里使用Intent获得相册图片数据,并返回原来界面;

这里说明一下

startActivityForResult(getAlbum, IMAGE_CODE);

补充{

startActivityForResult与startActivity的不同之处在于:
1、startActivity( )
仅仅是跳转到目标页面,若是想跳回当前页面,则必须再使用一次startActivity( )。
2、startActivityForResult( )
可以一次性完成这项任务,当程序执行到这段代码的时候,假若从T1Activity跳转到下一个Text2Activity,而当这个Text2Activity调用了finish()方法以后,程序会自动跳转回T1Activity,并调用前一个T1Activity中的onActivityResult( )方法。

}

startActivityForResult(getAlbum, IMAGE_CODE);

这里采用startActivityForResult来做跳转,此处的IMAGE_CODE实质是0为一个依据,可以写其他的值,但一定要>=0

然后重写onActivityResult用于接收刚刚得到的数据

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Bitmap bm = null; ContentResolver resolver = getContentResolver(); if (requestCode == IMAGE_CODE) { try {
Uri originalUri = data.getData(); bm = MediaStore.Images.Media.getBitmap(resolver, originalUri); imgShow.setImageBitmap(bm); } catch (IOException e) {
e.printStackTrace(); }
}

补充{
ContentProvider-----数据提供给第三方应用程序使用时使用
因为在Android系统里面,数据库是私有的。一般情况下外部应用程序是没有权限读取其他应用程序的数据。如果你想公开你自己的数据,你有两个选择:你可以创建你自己的内容提供器(一个ContentProvider子类)或者你可以给已有的提供器添加数据-如果存在一个控制同样类型数据的内容提供器且你拥有写的权限
}
这里是创建一个新的内容提供器,然后在Activity当中通过getContentResolver()可以得到当前应用的 ContentResolver实例

if (requestCode == IMAGE_CODE) {
resultCode为回传的标记这句话是在确认是否回传的是你所需要的;如果是就执行try;不然就执行catch (IOException e) {
e.printStackTrace();}先说这里当try语句中出现异常是时,会执行catch中的语句,IOException e也就是实例化Exception类型的对象。e是此对象引用名称。然后e(引用)会自动调用Exception类中指定的方法,也就出现了e.printStackTrace() ;。printStackTrace()方法的意思是:在命令行打印异常信息在程序中出错的位置及原因。
try {
Uri originalUri = data.getData(); bm = MediaStore.Images.Media.getBitmap(resolver, originalUri); imgShow.setImageBitmap(bm);接收数据处理数据并显示照片。
然后进行测试。


另附源码
MainActivity:
package com.example.administrator.myapplication1;import android.graphics.BitmapFactory;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import java.io.IOException;import android.net.Uri;import android.os.Bundle;import android.provider.MediaStore;import android.app.Activity;import android.content.ContentResolver;import android.content.Intent;import android.graphics.Bitmap;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ImageView;public class MainActivity extends AppCompatActivity { private final String IMAGE_TYPE = "image/*"; private final int IMAGE_CODE = 0; private Button choose=null; private ImageView imgShow; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init();} private void init() { choose=(Button) findViewById(R.id.button1); imgShow=(ImageView) findViewById(R.id.imgShow); choose.setOnClickListener(listener); } private OnClickListener listener=new OnClickListener(){ @Override public void onClick(View v) {
setImage(); }

}; private void setImage() {
Intent getAlbum = new Intent(Intent.ACTION_GET_CONTENT); getAlbum.setType(IMAGE_TYPE); startActivityForResult(getAlbum, IMAGE_CODE); } protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Bitmap bm = null; ContentResolver resolver = getContentResolver(); if (requestCode == IMAGE_CODE) { try {
Uri originalUri = data.getData(); bm = MediaStore.Images.Media.getBitmap(resolver, originalUri); imgShow.setImageBitmap(bm); } catch (IOException e) {
e.printStackTrace(); }
}
}
}


layout:activity_main.xml:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="选择照相" android:layout_marginRight="190dp" android:layout_marginTop="8dp" android:paddingBottom="2dp" android:background="#aabbcc" /> <ImageView android:id="@+id/imgShow" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_margin="15dip" /></LinearLayout>

‘叁’ android用WebView显示本地网页webview.loadUrl("file:///android_asset/haitian.htm"); 图片显示不出来。

webView显示不了图片,那肯定是html中的图片引入写错了,WebView(网络视图)能加载显示网页,可以将其视为一个浏览器。它使用了WebKit渲染引擎加载显示网页。
如果显示有问题,建议按以下方式去实现:
第一种方法的步骤:
1.在要Activity中实例化WebView组件:WebView webView = new WebView(this);
2.调用WebView的loadUrl()方法,设置WevView要显示的网页:
互联网用:webView.loadUrl("http://www.google.com");
本地文件用:webView.loadUrl("file:///android_asset/XX.html"); 本地文件存放在:assets 文件中
3.调用Activity的setContentView( )方法来显示网页视图
4.用WebView点链接看了很多页以后为了让WebView支持回退功能,需要覆盖覆盖Activity类的onKeyDown()方法,如果不做任何处理,点击系统回退剪键,整个浏览器会调用finish()而结束自身,而不是回退到上一页面
5.需要在AndroidManifest.xml文件中添加权限,否则会出现Web page not available错误。
<uses-permission android:name="android.permission.INTERNET" />

第二种方法的步骤:
1、在布局文件中声明WebView
2、在Activity中实例化WebView
3、调用WebView的loadUrl( )方法,设置WevView要显示的网页
4、为了让WebView能够响应超链接功能,调用setWebViewClient( )方法,设置 WebView视图
5、用WebView点链接看了很多页以后为了让WebView支持回退功能,需要覆盖覆盖Activity类的onKeyDown()方法,如果不做任何处理,点击系统回退剪键,整个浏览器会调用finish()而结束自身,而不是回退到上一页面
6、需要在AndroidManifest.xml文件中添加权限,否则出现Web page not available错误。
<uses-permission android:name="android.permission.INTERNET"/>

‘肆’ android如何从服务器取多张图片,在本地保存并显示

//获取connection conn = getURLConnection(url); is = conn.getInputStream(); //获取Bitmap的引用 Bitmap bitmap = BitmapFactory.decodeStream(is) //获取长度 int length = (int) conn.getContentLength(); if (length != -1) { byte[] imgData = new byte[length]; byte[] temp=new byte[512]; int readLen=0; int destPos=0; while((readLen=is.read(temp))>0){ System.array(temp, 0, imgData, destPos, readLen); destPos+=readLen; } bitmap=BitmapFactory.decodeByteArray(imgData, 0, imgData.length); }可能想得不是很完善,你可以参考参考。

‘伍’ Android 实现显示指定文件夹内所有图片用什么可以实现

1、程序,把Assets中的图像显示出来
try {
BufferedInputStream bis = new BufferedInputStream(getAssets()
.open("a.bmp"));
Bitmap bm = BitmapFactory.decodeStream(bis);
imageView01.setImageBitmap(bm);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("==========file not found======");
}
2、原理:Android中的资源分析
资源是Android应用程序中重要的组成部分。在应用程序中经常会使用字符串、菜单、图像、声音、视频等内容,都可以称之为资源。通过将资源放到与apk文件中与Android应用程序一同发布,在资源文件比较大的情况下,可以通过将资源作为外部文件来使用,我们将分析如何在Android应用程序中存储这些资源。
一、资源的存储
在android中,资源大多都是保存在res目录中,例如布局资源以XML文件的形式保存在res\layout目录中;图像资源保存着res\drawable目录中;菜单资源保存在res\menu目录中。ADT在生成apk文件时,这些目录中的资源都会被编译,然后保存到apk文件中。如果将资源文件放到res\raw目录中,资源将在不编译的情况下放入apk文件中。在程序运行时可以使用InputStream来读取res\raw目录中的资源。
如果使用的资源文件过大,我们可以考虑将资源文件作为外部文件单独发布。Android应用程序会从手机内存或者SD卡读取这些资源文件。
二、资源的种类
从资源文件的类型来划分,我们可以将资源文件划分为XML、图像和其它。以XML文件形式存储的资源可以放在res目录中的不同子目录里,用来表示不同种类的资源;而图像资源会放在res\drawable目录中。除此之外,可以将任意的资源嵌入Androidy应用程序中。比如音频和视频等,一般这些资源放在res\raw目录中。
表1、 Android支持的资源
目录 资源类型 描述
Res\values
XML
保存字符串、颜色、尺寸、类型、主题等资源,可以是任意文件名。对于字符串、颜色、尺寸等信息采用
Key-value形式表示,对于类型、主题等资源,采用其它形式表示
Res\layout
XML
保存布局信息。一个资源文件表示一个View或ViewGroup的布局
Res\menu
XML
保存菜单资源。一个资源文件表示一个菜单(包括子菜单)
Res\anim
XML
保存与动画相关的信息。可以定义帧(frame)动画和补间(tween)动画
Res\xml
XML
在该目录的文件可以是任意类型的XML文件,这些XML文件可以在运行时被读取。
Res\raw
任意类型
在该目录中的文件虽然也会被封装在apk文件中,但不会被编译。在该目录中可以放置任意类型的文件,例如,各种类型的文档、音频、视频文件等
Res\drawable
图像
该目录中的文件可以是多种格式的图像文件,例如,bmp、png、gif、jpg等。在该目录中的图像不需要分辨率非常高,aapt工具会优化这个目录中的图像文件。如果想按字流读取该目录下的图像文件,需要将图像文件放在res\raw目录中。
assets
任意类型
该目录中的资源与res\raw中的资源一样,也不会被编译。但不同的是该目录中的资源文件都不会生出资源ID
三、资源文件的命名
每一个资源文件或资源文件中的key-value对都会在ADT自动生成的R类(在R.java文件中)中找到相对应的ID.其中资源文件名或key-value对中的key就是R类中的java变量名。因此,资源文件名好key的命名首先要符合java变量的命名规则。
除了资源文件和key本身的命名要遵循相应的规则外,多个资源文件和key也要遵循唯一的原则。也就是说,同类资源的文件名或key不能重复。例如,两个表示字符串资源的key不能重复,就算这两个key在不同的XML文件中也不行。
由于ADT在生成ID时并不考虑资源文件的扩展名,因此,在res\drawable、res\raw等目录中不能存在文件名相同,扩展名不同的资源文件。例如在res\drawable目录不能同时放置icon.jpg和icon.png文件。
四、资源使用示例
在Android SDK中不仅提供了大量的系统资源,而且还允许开发人员定制自己的资源。不管是系统资源,还是自定义的资源,一般都会将这些资源放在res目录中,然后通过R类中的相应ID来引用这些资源。接下来将针对于XML类资源的使用进行分析。
XML资源实际上就是XML格式的文本文件,这些文件必须放在res\xml目录中。可以通过Resources.getXml方法获得处理指定XML文件的XmlResourceParser对象。实际上,XmlResourceParser对象处理XML文件的的过程主要是针对不同的状态点处理相应的代码,比如开始分析文档、开始分析标签、分析标签完成等,XmlResourceParser通过调用next方法不断更新当前的状态。
下面的代码,则是展示如何读取res\xml目录中的XML文件的内容,先在res\xml目录中建立一个xml文件。将AndroidManifest.xml文件复制到res\xml目录中,并改名为android.xml。
在准备完XML文件后,在onCreate方法中开始读取XML文件的内容,代码如下:
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView textView=(TextView)findViewById(R.id.textview);
StringBuffer sb=new StringBuffer();
// 获得处理android。xml文件的XmlResourceParser对象
XmlResourceParser xml=getResources().getXml(R.xml.android);
try
{
//切换到下一个状态,并获得当前状态的类型
int eventType =xml.next();
while(true)
{
//文档开始状态
if(eventType == XmlPullParser.START_DOCUMENT)
{
Log.d("start_document","start_document");
}
//标签开始状态
else if(eventType ==XmlPullParser.START_TAG)
{
Log.d("start_tag",xml.getName());
//将标签名称和当前标签的深度(根节点的depth是1,第2层节点的depth是2,类推)
sb.append(xml.getName()+"(depth:"+xml.getDepth()" ");
//获得当前标签的属性个数
int count=xml.getAttributeCount();
//将所有属性的名称和属性值添加到StringBuffer对象中
for(int i=0;i<count;i++)
{
sb.append(xml.getAttributeName(i)+":
"+xml.getAttributeValue(i)+"");
}
sb.append(")\n");
}
//标签结束状态
else if(eventType ==XmlPullParser.END_TAG)
{
Log.d("end_tag",xml.getName());
}
//读取标签内容状态
else if(eventType ==XmlPullParser.TEXT)
{
Log.d("text","text");
}
//文档结束状态
else if(eventType ==XmlPullParser.END_DOCUMENT)
{
Log.d("end_document","end_document");
//文档分析结束后,退出while循环
break;
}
//切换到下一个状态,并获得当前状态的类型
eventType =xml.next();

}
textView.setText(sb.toString());

}
catch(Exception e) {}
}
二、如果想读入文件
在使用getAssets().open("anhui.xml")返回输人流之后,就可以以此为参数,后面的处理跟普通的java的处理相同。

热点内容
java编译web项目吗 发布:2025-05-11 23:41:01 浏览:369
php文章管理系统 发布:2025-05-11 23:36:18 浏览:535
u3d加密 发布:2025-05-11 23:35:09 浏览:998
网吧上传英雄时刻 发布:2025-05-11 23:33:50 浏览:239
现代信息存储技术 发布:2025-05-11 23:23:07 浏览:599
服务器如何报备 发布:2025-05-11 22:52:51 浏览:39
ip访问不了网站 发布:2025-05-11 22:52:35 浏览:391
迷宫机器人算法 发布:2025-05-11 22:41:18 浏览:203
安卓手机如何改动态代码 发布:2025-05-11 22:25:13 浏览:163
c语言阶乘和 发布:2025-05-11 22:08:26 浏览:354