系统相机调用重点
android手机有自带的照相机和图库,我们做的项目中有时用到上传图片到服务器,今天做了一个项目用到这个功能,所以把我的代码记录下来和大家分享,第一次写博客希望各位大神多多批评。
首先上一段调用android相册和相机的代码:
代码如下:
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//调用android自带的照相机
photoUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
startActivityForResult(intent, 1);
代码如下:
Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);//调用android的图库
startActivityForResult(i, 2);
代码如下:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//完成照相后回调用此方法
super.onActivityResult(requestCode, resultCode, data);
case 1:
switch (resultCode) {
case Activity.RESULT_OK://照相完成点击确定
String sdStatus = Environment.getExternalStorageState();
if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { // 检测sd是否可用 Log.v("TestFile", "SD card is not avaiable/writeable right now.");
return; }
Bundle bundle = data.getExtras(); Bitmap bitmap = (Bitmap) bundle.get("data");// 获取相机返回的数据,并转换为Bitmap图片格式
FileOutputStream b = null;
File file = new File("/sdcard/pk4fun/"); file.mkdirs();// 创建文件夹,名称为pk4fun // 照片的命名,目标文件夹下,以当前时间数字串为名称,即可确保每张照片名称不相同。网上流传的其他Demo这里的照片名称都写死了,则会发生无论拍照多少张,后一张总会把前一张照片覆盖。细心的同学还可以设置这个字符串,比如加上“,,,”字样等;然后就会发现sd卡中myimage这个文件夹下,会保存刚刚调用相机拍出来的照片,照片名称不会重复。
String str = null;
Date date = null;
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");// 获取当前时间,进一步转化为字符串
date = new Date(resultCode); str = format.format(date);
String fileName = "/sdcard/myImage/" + str + ".jpg";
sendBroadcast(fileName);
try {
b = new FileOutputStream(fileName); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, b);// 把数据写入文件 } catch (FileNotFoundException e) { e.printStackTrace();
} finally {
try {
b.flush();
b.close();
} catch (IOException e) {
e.printStackTrace();
}
} break;
case Activity.RESULT_CANCELED:// 取消
break;
}
break;
case 2:
switch (resultCode) {
case Activity.RESULT_OK: {
Uri uri = data.getData();
Cursor cursor = mActivity.getContentResolver().query(uri, null,
null, null, null);
cursor.moveToFirst();
String imgNo = cursor.getString(0); // 图片编号
String imgPath = cursor.getString(1); // 图片文件路径
String imgSize = cursor.getString(2); // 图片大小
String imgName = cursor.getString(3); // 图片文件名
cursor.close();
// Options options = new BitmapFactory.Options();
// options.inJustDecodeBounds = false; // options.inSampleSize = 10;
// Bitmap bitmap = BitmapFactory.decodeFile(imgPath, options);
}
break;
case Activity.RESULT_CANCELED:// 取消
break;
}
break;
}
最后记得加权限
Android调用系统相机和自定义相机实例
本博文主要是介绍了android上使用相机进行拍照并显示的两种方式~并且由于涉及到要把拍到的照片显示出来~该例子也会涉及到Android加载大图片时候的处理,避免OOM,,还有简要提一下有些人SurfaceView出现黑屏的原因。
Android应用拍照的两种方式,下面为两种形式的Demo展示出来的效果。
知识点:
一、调用系统自带的相机应用
二、自定义我们自己的拍照界面
三、关于计算机解析图片原理,如何正确加载图片到Android应用中,
所需权限:
?
1
2
3
4
5
6
一、调用系统照相机程序拍照,方式一,
1.定义所需要的权限
2.我们需要定义调用系统相机App的Intent,当然是通过设定IntentFilter中的Action来打开我们想要的activity了。
MediaStore.ACTION_IMAGE_CAPTURE - 这个Action将打开拍照的系统相机。返回一个Image
MediaStore.ACTION_VIDEO_CAPTURE - 这个Action将打开录像的系统
相机。返回一个Video
在MediaStore.ACTION_IMAGE_CAPTURE中~我们可以看到这段话:
【The caller may pass an extra EXTRA_OUTPUT to control where this image will be
written. If the EXTRA_OUTPUT is not present, then a small sized image is returned
as a Bitmap object in the extra field. This is useful for applications that only
need a small image. If the EXTRA_OUTPUT is present, then the full-sized image will
be written to the Uri value of EXTRA_OUTPUT.】
3.API规定我们传入拍照得到图片的存储位置的Uri。否则Bimmap将以一个压缩后的形式返回到我们当前Activity.
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the
image file name
则会把拍照的图片存储到我们传入的Uri对应的File里面。
4.我们调用startActivityForResult(intent)来启动这样一个系统相机app之后~然后在当前应用Activity的onActivityResult()中接受到返回拍照成功或者失败的消息~做相应处理。
5.“压缩处理”(Android应用中加载大图片),并显示到ImageView中。
二、自定义照相机
1.检查相机是否存在~并获取相机Camera。
2.创建一个相机图像预览类:extends SurfaceView 并 implements SurfaceHolder ,我定义:MySurfaceView,
3.把这个预览类放入一个自定义布局layout里面~并且可以在layout里添加自己的其他按钮
4.设置对应的拍照按钮然后听事件
5.捕获照片和保存图片
6.释放掉我们使用的相机Camera~不然之后其他应用将无法使用它。
三、计算机解析图片的方式和Android中大图片Bitmap的压缩显示处理
这个问题有点老生长谈了~平时我们经常遇到一些图片资源~我们把它加载到内存发现抛出内存不够用的异常~即OOM~当然加载图片时出现的OOM情况有很多种~比如单张图片没有做压缩~导致图片占用内存过大而发生内存溢出~也有多张图片一次性加载进来~导致的内存溢出。
通常单张大图~我们加载进来往往会经过一个图片的压缩处理的过程~而如果多张图片加载~我们可能就需要一些缓存机制~再加上一些算法来保证程序不出现OOM。
我们这里想要讲的知识点跟单张大图比较有关系
首先~我们知道一个图片~它是由很多像素点来表示的~而像素点的个数只跟图片的分辨率有关~而跟图片所占的内存空间大小无关。比如我们的桌面壁纸:1280 * 768 的分辨率~那么它就有 1280 * 768 = 983040
个像素点~这意味着什么呢,我们知道我们要表示一个像素点的颜色~最经常我们需要RGB三种颜色来表示~而R:0~255~相当于两个FF的位置~就是8位~这样的话RGB合起来~一个像素点的表示就需要24位,这就是我们平衡听到的24位图,~而加上透明度的8位~就是平时说的32位图。那么一张图片~它加载到内存中的话~它会占用多大的空间呢,
计算方法:(像素点 * 一个像素所占用的byte数) / 1024 / 1024 (MB) 以1280 * 768 的分辨率~32位图为例:所占内存大小: ((1280 * 768
* (32 / 8,) / 1024)/1024=3.75(MB)
说了这么多~那么我们再来说下Android系统的规定吧~Android系统严格规定了每个应用所能分配的最大的内存为多少~我们知道有一个VM值,在我们创建模拟器的时候,~这个VM值里面便是我们所说的堆空间(Heap Size),当你的应用占用的空间已经超出我们定义的堆空间大小~那么不好意思~OOM
这样的话~我们明白了图片的大小占据原理~还有尽量不要超出这个堆空间~那么OK~现在问题变得简单了。如果我们有一种方式可以在图片加载进来之前~知道图片的大小~然后改变它的长、宽~这样的话~分辨率便变小了~这样出来的乘积也就变小了。比如:我们的屏幕只有320 * 240~ 这时候你加载大分辨的图片进来最多也只能显示成这样~所以我们常采用的是对图片进行压缩处理。这里有个概念叫压缩比: 长:1024 / 320 = 3.2 约等于 3
宽:768 / 240 = 3.2
那这样我们如果把图片压缩成这样大小的~最后的图片加载进来的大小便是
((320 * 240 * (32 / 8,) / 1024)/1024=0.29(MB)
希望我这样讲完~大家都能听懂了~我这里先把照相机实例中出现的关于如果处理这块图片的代码先粘出来
?
1// -----------------------Android大图的处理方式
2---------------------------
3 privatevoidsetPicToImageView(ImageView imageView, File imageFile){
4 intimageViewWidth = imageView.getWidth();5 intimageViewHeight = imageView.getHeight();6 BitmapFactory.Options opts = newOptions();
7
8 //设置这个,只得到Bitmap的属性信息放入opts,而不把Bitmap加载到内9存中
10 opts.inJustDecodeBounds = true;
11 BitmapFactory.decodeFile(imageFile.getPath(), opts);
12
13 intbitmapWidth = opts.outWidth;14 intbitmapHeight = opts.outHeight;15 //取最大的比例,保证整个图片的长或者宽必定在该屏幕中可以显示得下16 intscale = Math.max(imageViewWidth / bitmapWidth,
17imageViewHeight / bitmapHeight);
18
19 //缩放的比例
20 opts.inSampleSize = scale;
21 //内存不足时可被回收
22 opts.inPurgeable = true;
23 //设置为false,表示不仅Bitmap的属性,也要加载bitmap24 opts.inJustDecodeBounds = false;
25
Bitmap bitmap = BitmapFactory.decodeFile(imageFile.getPath(),
opts);
imageView.setImageBitmap(bitmap);
}
关于堆空间:
堆,HEAP,是VM中占用内存最多的部分~通常是动态分配的。堆的大小不是一成不变的~通常有一个分配机制来控制它的大小。比如初始的HEAP是4M大~当4M的空间被占用超过75%的时候~重新分配堆为8M大,当8M被占用超过75%~分配堆为16M大。倒过来~当16M的堆利用不足30%的时候~缩减它的大小为8M大。重新设置堆的大小~尤其是压缩~一般会涉及到内存的拷贝~所以变更堆的大小对效率有不良影响。
废话少说下面就看代码咯~~为了大家看起来方便点~代码的结构可能不是很规范:
源码下载地址:
代码部分:
一、用系统的相机
按钮点击之后开启系统相机Activity
?
1findViewById(R.id.system_camera_btn).set OnClickListener(new2OnClickListener() {
3
4 @Override
5 publicvoidonClick(View v) {
6 Intent intent = newIntent();
7 intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
8 imageFileUri = getOutFileUri(TYPE_FILE_IMAGE);//得到一9个 File Uri
10 intent.putExtra(MediaStore.EXTRA_OUTPUT,
11 imageFileUri);
startActivityForResult(intent, SYSTEM_CAMERA_REQUESTCODE);
}
});
生成File文件~并得到Uri
?
1// -----------------------生成
2Uri ---------------------------------------
3 //得到输出文件的URI
4 privateUri getOutFileUri(intfileType) {
5 returnUri.fromFile(getOutFile(fileType));6 }
7
8 //生成输出文件
9 privateFile getOutFile(intfileType) {
1
0 String storageState = Environment.getExternalStorageState();
1if(Environment.MEDIA_REMOVED.equals(storageState)){
1 Toast.makeText(getApplicationContext(), "oh,no, SD卡不存在1", Toast.LENGTH_SHORT).show();2 returnnull;
1}
3
1File mediaStorageDir = newFile (Environment4 .getExternalStoragePublicDirectory(Environment.DIRECTO
1RY_PICTURES)
5 ,"MyPictures");
1if(!mediaStorageDir.exists()){6 if(!mediaStorageDir.mkdirs()){1Log.i("MyPictures", "创建图片存储路径目录失败");7 Log.i("MyPictures", "mediaStorageDir : "+ 1mediaStorageDir.getPath());
8 returnnull;
1}
9 }
2
0 File file = newFile(getFilePath(mediaStorageDir,fileType));
2
1 returnfile;
2}
2 //生成输出文件路径
2privateString getFilePath(File mediaStorageDir, intfileType){3 String timeStamp =newSimpleDateFormat("yyyyMMdd_HHmmss")2.format(newDate());4 String filePath = mediaStorageDir.getPath() + File.separator;
2if(fileType == TYPE_FILE_IMAGE){5 filePath += ("IMG_"+ timeStamp + ".jpg");2}elseif(fileType == TYPE_FILE_VEDIO){6 filePath += ("VIDEO_"+ timeStamp + ".mp4");2}else{
7 returnnull;
2}
8 returnfilePath;
2}
9
3
0
3
1
3
2
3
3
3
4
3
5
3
6
3
7
3
8
3
9
4
0
4
1
4
2
4
3
4
4
4
5
二、用自定义的相机
检测相机设备是否存在:
?
1/* 检测相机是否存在*/
2 privatebooleancheckCameraHardWare(Context context){
3 PackageManager packageManager = context.getPackageManager();
4 if
5(packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA)){
6 returntrue;
7 }
8 returnfalse;
}
按钮按下之后的判断:
?
1findViewById(R.id.myapp_camera_btn).setOnClickListener( new2OnClickListener() {
3
4 @Override
5 publicvoidonClick(View v) {6 if(checkCameraHardWare(getApplicationContext())){
7 Intent intent = newIntent(getApplicationContext(),
8MyCameraActivity. class);
9 startActivity(intent);10 }else{
11 Toast.makeText(getApplicationContext(), "没有相机12存在 ", Toast.LENGTH_SHORT).show();13 }
}
});
自定义的SurfaceView类:
?
1package cn.panghu.camera;
2
3import android.content.Context;4import android.graphics.Canvas;5import android.graphics.Rect;6import android.hardware.Camera;7import android.util.AttributeSet;8import android.view.Surface;
9import android.view.SurfaceHolder;1importandroid.view.SurfaceView;0
1publicclassMySurfaceView extendsSurfaceView implements1SurfaceHolder.Callback{
1
2
1privateCamera camera = null;
3 privateSurfaceHolder surfaceHolder = null;1
4 publicMySurfaceView(Context context, Camera camera) {
1super(context);
5 this.camera = camera;
1surfaceHolder = getHolder();6 surfaceHolder.addCallback(this);
1surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS
7);
1}
8 publicMySurfaceView(Context context) {1super(context);
9 // TODO Auto-generated constructor stub2}
0
2@Override
1 publicvoidsurfaceCreated(SurfaceHolder holder) {
2try{
2 camera.setPreviewDisplay(surfaceHolder);
2camera.startPreview();3 }catch(Exception e){
2e.printStackTrace();4 }
2}
5
2@Override
6 publicvoidsurfaceChanged(SurfaceHolder holder, intformat, int2width,
7 intheight) {
2//根本没有可处理的SurfaceView
8 if(surfaceHolder.getSurface() == null){2return;
9 }
3
0 //先停止Camera的预览
3try{
1 camera.stopPreview();3}catch(Exception e){
2 e.printStackTrace();3}
3
3//这里可以做一些我们要做的变换。
4
3//重新开启Camera的预览功能
5 try{3camera.setPreviewDisplay(surfaceHolder);
6 camera.startPreview();
3}catch(Exception e){
7 e.printStackTrace();
3}
8 }
3
9 @Override
4publicvoidsurfaceDestroyed(SurfaceHolder holder) {
0
4}
1
4
2}
4
3
4
4
4
5
4
6
4
7
4
8
4
9
5
0
5
1
5
2
5
3
5
4
5
5
5
6
5
7 5
8 5
9 6
0 6
1 6
2 6
3 6
4 6
5 6
6 6
7 6
8 6
9 7
0 7
1 7
2 自定义相机Activity类:(为了避免当用户按下Home键~之后再回到
我们App中~SurfaceView变黑屏~我们需要将SurfaceView加载到
FrameLayout中的代码写在onResume中)
?
1package cn.panghu.camera;
2 3import java.io.File;
4 importjava.io.FileNotFoundException;
5import java.io.FileOutputStream;6import java.io.IOException;
7import java.text.SimpleDateFormat;8import java.util.Date;
9
10import android.app.Activity;11import android.hardware.Camera;12import android.hardware.Camera.PictureCallback;
13import android.net.Uri;
14import android.os.Bundle;
15import android.os.Environment;16import android.util.Log;
17import android.view.View;
18import android.view.View.OnClickListener;
19import android.widget.Button;20import android.widget.FrameLayout;21import android.widget.Toast;22
23import com.example.camerademoapp.R;24
25public classMyCameraActivity extendsActivity {26 privateButton btn_camera_capture = null;27 privateButton btn_camera_cancel = null;28 privateButton btn_camera_ok = null;
29
30 privateCamera camera = null;
31 privateMySurfaceView mySurfaceView = null;32
33 privatebyte[] buffer = null;
34
35 privatefinalintTYPE_FILE_IMAGE = 1;
36 privatefinalintTYPE_FILE_VEDIO = 2;
37
38 privatePictureCallback pictureCallback = newPictureCallback() {
39
40 @Override
41 publicvoidonPictureTaken(byte[] data, Camera camera) {
42 if(data == null){
43 Log.i("MyPicture", "picture taken data: null");44 }else{
45 Log.i("MyPicture", "picture taken data: "+ 46data.length);
47 }
48
49 buffer = newbyte[data.length];
50 buffer = data.clone();
51 }
52 };
53 @Override
54 protectedvoidonCreate(Bundle savedInstanceState) {55 // TODO Auto-generated method stub
56 super.onCreate(savedInstanceState);
57 setContentView(R.layout.mycamera_layout);58
59 btn_camera_capture = (Button)
60findViewById(R.id .camera_capture);
61 btn_camera_ok = (Button) findViewById(R.id.camera_ok);
62 btn_camera_cancel = (Button) findViewById(R.id.camera_cancel);
63
64
65 btn_camera_capture.setOnClickListener(newOnClickListener() {66 @Override
67 publicvoidonClick(View v) {
68
69 camera.takePicture(null, null, pictureCallback);70
71 btn_camera_capture.setVisibility(View.INVISIBLE);
72 btn_camera_ok.setVisibility(View.VISIBLE);73 btn_camera_cancel.setVisibility(View.VISIBLE);74 }
75 });
76 btn_camera_ok.setOnClickListener(newOnClickListener() {77
78 @Override
79 publicvoidonClick(View v) {
80 //保存图片
81 saveImageToFile();
82
83 camera.startPreview();
84 btn_camera_capture.setVisibility(View.VISIBLE);85 btn_camera_ok.setVisibility(View.INVISIBLE);86 btn_camera_cancel.setVisibility(View.INVISIBLE);87 }
88 });
89 btn_camera_cancel.setOnClickListener(newOnClickListener() {90
91 @Override
92 publicvoidonClick(View v) {
93
94 camera.startPreview();95 btn_camera_capture.setVisibility(View.VISIBLE);
96 btn_camera_ok.setVisibility(View.INVISIBLE);
97 btn_camera_cancel.setVisibility(View.INVISIBLE); 98
99 }
10});
0 }
10@Override
1 protectedvoidonPause() {
10// TODO Auto-generated method stub2 super.onPause();
10
3 camera.release();
10camera = null;
4 }
10
5 @Override
10protectedvoidonResume() {
6 // TODO Auto-generated method stub10super.onResume();
7 if(camera == null){
10camera = getCameraInstance();8 }
10//必须放在onResume中,不然会出现Home键之后,再回到该APP,黑屏9 mySurfaceView = newMySurfaceView(getApplicationContext(),
11camera);
0 FrameLayout preview = (FrameLayout) 11findViewById(R.id.camera_preview);1 preview.addView(mySurfaceView);11}
2
11/*得到一相机对象*/
3 privateCamera getCameraInstance(){11Camera camera = null;
4 try{
11camera = camera.open();
5 }catch(Exception e){
11e.printStackTrace();
6 }
11returncamera;
7 }
11
8
11//-----------------------保存图片
9---------------------------------------
12privatevoidsaveImageToFile(){
0 File file = getOutFile(TYPE_FILE_IMAGE);12if(file == null){
1 Toast.makeText(getApplicationContext(), "文件创建失败,请检12查SD卡读写权限", Toast.LENGTH_SHORT).show();2 return;
12}
3 Log.i("MyPicture", "自定义相机图片路径:"+ file.getPath());12Toast.makeText(getApplicationContext(), "图片保存路径:"+ 4file.getPath(), Toast.LENGTH_SHORT).show();
12if(buffer == null){
5 Log.i("MyPicture", "自定义相机Buffer: null");12}else{
6 try{
12FileOutputStream fos = newFileOutputStream(file);7 fos.write(buffer);
12fos.close();
8 }catch(IOException e){
12e.printStackTrace();
9 }
13}
0 }
13
1 //-----------------------生成
13Uri---------------------------------------2 //得到输出文件的URI
13privateUri getOutFileUri(intfileType) {
3 returnUri.fromFile(getOutFile(fileType));13}
4
13//生成输出文件
5 privateFile getOutFile(intfileType) {
13
6 String storageState = Environment.getExternalStorageState();13if(Environment.MEDIA_REMOVED.equals(storageState)){
7 Toast.makeText(getApplicationContext(), "oh,no, SD卡不存在13", Toast.LENGTH_SHORT).show();
8 returnnull;
13}
9
14File mediaStorageDir = newFile (Environment
0 .getExternalStoragePublicDirectory(Environment.DIRECT
14ORY_PICTURES)
1 ,"MyPictures");
14if(!mediaStorageDir.exists()){2 if(!mediaStorageDir.mkdirs()){14Log.i("MyPictures", "创建图片存储路径目录失败");3 Log.i("MyPictures", "mediaStorageDir : "+ 14mediaStorageDir.getPath());
4 returnnull;
14}
5 }
14
6 File file = newFile(getFilePath(mediaStorageDir,fileType));
14
7 returnfile;
14}
8 //生成输出文件路径
14privateString getFilePath(File mediaStorageDir, intfileType){9 String timeStamp =newSimpleDateFormat("yyyyMMdd_HHmmss")15.format(newDate());0 String filePath = mediaStorageDir.getPath() + File.separator;15if(fileType == TYPE_FILE_IMAGE){1 filePath += ("IMG_"+ timeStamp + ".jpg");15}elseif(fileType == TYPE_FILE_VEDIO){2 filePath += ("VIDEO_"+ timeStamp + ".mp4");15}else{
3 returnnull;
15}
4 returnfilePath;
15}
5
15}
6
15
7
15
8
15
9
16
0
16
1
16
2 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 18
4 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
2月12日北京OSC源创会 —— 开源技术的年终盛典 ?
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
videopath = Environment.getExternalStorageDirectory().toString() + "/abc/";
Log.i("DareDream", videopath);
String fileName = new
SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + ".3gp";
File out = new File(videopath);
if (!out.exists()) {
out.mkdirs();
}
out = new File(videopath, fileName);
videopath = videopath + fileName;
Uri uri = Uri.fromFile(out);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
startActivityForResult(intent, REQUEST_CODE_TAKE_VIDEO);
为什么我这样用在手机上运行时 点击停止录像它就报错了,但在abc文件夹上却有那录像
文件,怎么会那么诡异额?求大神帮忙!!!
zhuogaopeng
发帖于 3年前
4回/6468阅
标签: <无>
, 举报
, | 分享到
0收藏(1) 按票数排序 显示最新
古今名言
敏而好学,不耻下问——孔子
业精于勤,荒于嬉;行成于思,毁于随——韩愈
兴于《诗》,立于礼,成于乐——孔子
己所不欲,勿施于人——孔子
读书破万卷,下笔如有神——杜甫
读书有三到,谓心到,眼到,口到——朱熹
立身以立学为先,立学以读书为本——欧阳修
读万卷书,行万里路——刘彝
黑发不知勤学早,白首方悔读书迟——颜真卿
书卷多情似故人,晨昏忧乐每相亲——于谦
书犹药也,善读之可以医愚——刘向
莫等闲,白了少年头,空悲切——岳飞
发奋识遍天下字,立志读尽人间书——苏轼
鸟欲高飞先振翅,人求上进先读书——李苦禅
立志宜思真品格,读书须尽苦功夫——阮元
非淡泊无以明志,非宁静无以致远——诸葛亮
熟读唐诗三百首,不会作诗也会吟——孙洙《唐诗三百首序》
书到用时方恨少,事非经过不知难——陆游
问渠那得清如许,为有源头活水来——朱熹
旧书不厌百回读,熟读精思子自知——苏轼
书痴者文必工,艺痴者技必良——蒲松龄
声明
访问者可将本资料提供的内容用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯本文档及相关权利人的合法权利。谢谢合作~