1、图片处理

  • 加载大图片

    • 图片大小的计算

图片大小 = 图片的总像素 * 每个像素占用的大小

* 单色图:每个像素占用1/8个字节
* 16色图:每个像素占用1/2个字节
* 256色图:每个像素占用1个字节
* 24位图:每个像素占用3个字节

* 图片总大小 = 图片总像素 * 每个像素的大小
* 单色:只能表示两种颜色,只需要使用两个数字即可,0和1表示黑白
* 每个像素需要使用一个长度为1的二进制数字表示颜色
* 每个像素占用1/8个字节
* 16色:能表示16种颜色,需要16个数字
* 0 - 15,二进制表示:0000 - 1111
* 每个像素需要一个长度为4的二进制数字表示颜色信息
* 每个像素占用1/2个字节
* 256色:能表示256种颜色,需要256个数字
* 0 - 255,二进制表示:0000 0000 - 1111 1111
* 每个像素需要长度为8的二进制数字
* 每个像素占用1个字节
* 24位色:能表示一千六百七十七万多种颜色
* 每个像素占用3个字节
* R:0-255,占用1个字节
* G:同上
* B:同上

Android系统以ARGB表示每个像素,所以每个像素占用4个字节,很容易内存溢出

  • 对图片进行缩放

* 获取屏幕宽高

Display dp = getWindowManager().getDefaultDisplay();
int screenWidth = dp.getWidth();
int screenHeight = dp.getHeight();
* 获取图片宽高

Options opts = new Options();
//请求图片属性但不申请内存
opts.inJustDecodeBounds = true;
BitmapFactory.decodeFile("sdcard/dog.jpg", opts);
int imageWidth = opts.outWidth;
int imageHeight = opts.outHeight;
* 图片的宽高除以屏幕宽高,算出宽和高的缩放比例,取较大值作为图片的缩放比例

int scale = 1;
int scaleX = imageWidth / screenWidth;
int scaleY = imageHeight / screenHeight;
if(scaleX >= scaleY && scaleX > 1){
scale = scaleX;
}
else if(scaleY > scaleX && scaleY > 1){
scale = scaleY;
}
* 按缩放比例加载图片

//设置缩放比例
opts.inSampleSize = scale;
//为图片申请内存
opts.inJustDecodeBounds = false;
Bitmap bm = BitmapFactory.decodeFile("sdcard/dog.jpg", opts);
iv.setImageBitmap(bm);//如果不压缩,在加载图片时(所有图片格式),会分析像素,每个像素会占用4个字节(ARGB),A代表透明度。1.73M的JPG文件,加载时会占用20多M的内存解析。

  • 在内存中创建图片的副本

直接加载的bitmap对象是只读的,无法修改,要修改图片只能在内存中创建出一个一模一样的bitmap副本,然后修改副本

//加载原图

Bitmap srcBm = BitmapFactory.decodeResource(getResource(),R.drawable.photo3);
//Bitmap srcBm = BitmapFactory.decodeFile("sdcard/photo3.jpg");
iv_src.setImageBitmap(srcBm);

//创建与原图大小一致的空白bitmap
Bitmap copyBm = Bitmap.createBitmap(srcBm.getWidth(), srcBm.getHeight(), srcBm.getConfig());
//定义画笔
Paint paint = new Paint();
//把纸铺在画版上
Canvas canvas = new Canvas(copyBm);
//把srcBm的内容绘制在copyBm上
canvas.drawBitmap(srcBm, new Matrix(), paint);

iv_copy.setImageBitmap(copyBm);

  • 对图片进行特效处理

* 首先定义一个矩阵对象

Matrix mt = new Matrix();
* 缩放效果

//x轴缩放1倍,y轴缩放0.5倍
mt.setScale(1, 0.5f);

* 旋转效果

//以copyBm.getWidth() / 2, copyBm.getHeight() / 2点为轴点,顺时旋转30度
mt.setRotate(30, copyBm.getWidth() / 2, copyBm.getHeight() / 2);
* 平移

//x轴坐标+10,y轴坐标+20
mt.setTranslate(10, 20);
* 镜面

//把X坐标都变成负数
mt.setScale(-1, 1);
//图片整体向右移
mt.postTranslate(copyBm.getWidth(), 0);
* 倒影

//把Y坐标都变成负数
mt.setScale(1, -1);
//图片整体向下移
mt.postTranslate(0, copyBm.getHeight());//不能用setTranslate,不用重复用set,再次set时,先复原再设置

  • 画画板

记录用户触摸事件的XY坐标,绘制直线
* 给ImageView设置触摸侦听,得到用户的触摸事件,并获知用户触摸ImageView的坐标

iv.setOnTouchListener(new OnTouchListener() {

@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
switch (event.getAction()) {
//触摸屏幕
case MotionEvent.ACTION_DOWN:
//得到触摸屏幕时手指的坐标
startX = (int) event.getX();
startY = (int) event.getY();
break;
//在屏幕上滑动
case MotionEvent.ACTION_MOVE:
//用户滑动手指,坐标不断的改变,获取最新坐标
int newX = (int) event.getX();
int newY = (int) event.getY();
//用上次onTouch方法得到的坐标和本次得到的坐标绘制直线
canvas.drawLine(startX, startY, newX, newY, paint);
iv.setImageBitmap(copyBm);
startX = newX;
startY = newY;
break;

}
return true;
}
});
* 刷子效果,加粗画笔

paint.setStrokeWidth(8);
* 调色板,改变画笔颜色

paint.setColor(Color.GREEN);
* 保存图片至SD卡

FileOutputStream fos = null;
try {
fos = new FileOutputStream(new File("sdcard/dazuo.png"));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//保存图片
copyBm.compress(CompressFormat.PNG, 100, fos);// 有可能打开SD卡,找不到图片(图片已经在SD卡中,但图库中没有)。

图片在sd卡中,但是图库没有
* 系统每次遍历sd卡时,会把sd卡中的所有多媒体文件(图片、音频、视频)都在MediaStore数据库中保存一个索引,这个索引包含的字段有文件名、文件保存路径、标题、艺术家、持续时间
* 每次启动图库时,图库应用并不会去遍历sd卡,检测图片文件,而是直接从MediaStore数据库读取图片的索引,从而读取到这张图片

* 系统每次收到SD卡就绪广播时,都会去遍历sd卡的所有文件和文件夹,把遍历到的所有多媒体文件都在MediaStore数据库保存一个索引,这个索引包含多媒体文件的文件名、路径、大小
* 系统开机或者点击加载sd卡按钮时,系统会发送sd卡就绪广播,我们也可以手动发送就绪广播

Intent intent = new Intent();
intent.setAction(Intent.ACTION_MEDIA_MOUNTED);
intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory()));
sendBroadcast(intent);

----------------------------------------------------------------------------------------------

撕衣服
* 原理:把穿内衣和穿外衣的照片重叠显示,内衣照在下面,用户滑动屏幕时,触摸的是外衣照,把手指经过的像素都置为透明,内衣照就显示出来了,如果图片大于屏幕(但加载不会内存溢出),图片是被压缩显示在屏幕,在屏幕上滑行得到的坐标,与图片上坐标不对应,会出现坐标偏移。需要计算出图片和屏幕的缩放比例。

屏幕高/图片高=滑动坐标/得出需要的值;

iv.setOnTouchListener(new OnTouchListener() {

@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
int newX = (int) event.getX();
int newY = (int) event.getY();
//把指定的像素变成透明
copyBm.setPixel(newX, newY, Color.TRANSPARENT);
iv.setImageBitmap(copyBm);
break;

}
return true;
}
});
* 每次只设置一个像素点太慢,以触摸的像素为圆心,半径为5画圆,圆内的像素全部置为透明

for (int i = -5; i < 6; i++) {
for (int j = -5; j < 6; j++) {
if(Math.sqrt(i * i + j * j) <= 5)

if(newX + i < copyBm.getWidth() & newY+j < compBm.getHeight()

&& newX + i >=0 && newY + j >= 0 )

copyBm.setPixel(newX + i, newY + j, Color.TRANSPARENT);
}
}

2、音频处理

  • 播放服务

* 播放音频的代码应该运行在服务中,定义一个播放服务MusicService
* 服务里定义play、stop、pause、continuePlay等方法

private void play() {
// TODO Auto-generated method stub
player.reset();
try {
player.setDataSource("sdcard/bzj.mp3");
player.prepare();

player.start();

//在线播放

//player.setDataSource("http://192.168.0.1/music/bzj.mp3");
//player.prepareAsync();

// player.setOnPreparedListener(new OnPrepareListener(){

@override

//public void onPrepared(MediaPlayer mp)

//{

//player.start();

//}

//}

//);

} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
private void pause() {
player.pause();
}
private void stop() {
player.stop();
}
private void continuePlay() {
player.start();
}
* 把这几个方法抽取成一个接口MusicInterface
* 定义一个中间人类,继承Binder,实现MusicInterface
* 先start启动MusicService,再bind

Intent intent = new Intent(this, MusicService.class);
startService(intent);
bindService(intent, conn, BIND_AUTO_CREATE);

  • 根据播放进度设置进度条

* 获取当前的播放时间和当前音频的最长时间

int currentPosition = player.getCurrentPosition();
int duration = player.getDuration();
* 播放进度需要不停的获取,不停的刷新进度条,使用计时器每500毫秒获取一次播放进度
* 发消息至Handler,把播放进度放进Message对象中,在Handler中更新SeekBar的进度,可以拖动的进度条

if(timer == null){//避免重发创建

timer = new Timer();//在onDestroy中调用timer.cancel();取消计时器。并且销毁player.  player.release();
timer.schedule(new TimerTask() {

@Override
public void run() {
int currentPosition = player.getCurrentPosition();
int duration = player.getDuration();
Message msg = Message.obtain();
//把播放进度存入Message中
Bundle data = new Bundle();
data.putInt("currentPosition", currentPosition);
data.putInt("duration", duration);
msg.setData(data);
MainActivity.handler.sendMessage(msg);
}
}, 5, 500);//计时任务开始5毫秒后,RUN方法执行,每500毫秒执行一次
* 在Activity中定义Handler

static Handler handler = new Handler(){//设置为静态,在整个项目中都可以访问(包括服务),并且谷歌提示静态不会发生内存溢出
public void handleMessage(android.os.Message msg) {
//取出消息携带的数据
Bundle data = msg.getData();
int currentPosition = data.getInt("currentPosition");
int duration = data.getInt("duration");

//设置播放进度
sb.setMax(duration);
sb.setProgress(currentPosition);
};
};

  • 拖动进度条改变播放进度

//给sb设置一个拖动侦听
sb.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
//停止拖动时调用
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
int progress = seekBar.getProgress();
mi.seekTo(progress);//在接口和服务中定义seekTo方法
}
//开始拖动时调用
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub

}
//拖动的时候不断调用
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// TODO Auto-generated method stub

}
});

3、视频处理

  • SurfaceView

* 对画面的实时更新要求较高
* 双缓冲技术:内存中有两个画布,A画布显示至屏幕,B画布在内存中绘制下一帧画面,绘制完毕后B显示至屏幕,A在内存中继续绘制下一帧画面
* 播放视频也是用MediaPlayer,不过跟音频不同,要设置显示在哪个SurfaceView

* VideoView(视频播放组件,应用更简单,且支持多种格式)

VideoView vv = (VideoView)findViewById(R.id.vv);

vv.setVideoPath("sdcard/2.3gp");

vv.start();

* 第三方架构:FFMPEG:开源免费音视频编解码器(c++)

* 第三方架构:vitamio(java)

SurfaceView sv = (SurfaceView) findViewById(R.id.sv);
SurfaceHolder sh = sv.getHolder();

MediaPlayer player = new MediaPlayer();
player.reset();
try {
player.setDataSource("sdcard/2.3gp");
player.setDisplay(sh);
player.prepare();

player.start();
} catch (Exception e) {
e.printStackTrace();
}

* SurfaceView是重量级组件,可见时才会创建
* 给SurfaceHolder设置CallBack,类似于侦听,可以知道SurfaceView的状态

sh.addCallback(new Callback() {
//SurfaceView销毁时调用
@Override
public void surfaceDestroyed(SurfaceHolder holder) {

if(player != null){

progress = player.getCurrentPosition();//定义全局变量progress保存进度
player.stop();

player.release();
player = null;

}
}
//SurfaceView创建时调用
@Override
public void surfaceCreated(SurfaceHolder holder) {

if(player == null){

player = new MediaPlayer();

player.reset();
try {
player.setDataSource("sdcard/2.3gp");
player.setDisplay(sh);
player.prepare();

player.seekTo(progress);

player.start();
} catch (Exception e) {
e.printStackTrace();
}

}}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {

}
});
* SurfaceView一旦不可见,就会被销毁,一旦可见,就会被创建,销毁时停止播放,再次创建时再开始播放

4、摄像头

* 启动系统提供的拍照程序

//隐式启动系统提供的拍照Activity
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//设置照片的保存路径
File file = new File(Environment.getExternalStorageDirectory(), "haha.jpg");
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
startActivityForResult(intent, 0);
* 启动系统提供的摄像程序

Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);

File file = new File(Environment.getExternalStorageDirectory(), "haha.3gp");
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
//设置保存视频文件的质量
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
startActivityForResult(intent, 0);

创建自定义相机可参照帮助文档: develop->API Guid -> Camera

-------------------------------------------------------------------------------------------

 package com.itheima.cameraapp;

 import java.io.IOException;

 import android.content.Context;
import android.hardware.Camera;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView; /** 预览类 */
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
public static final String TAG = "camera";
private SurfaceHolder mHolder;
private Camera mCamera; public CameraPreview(Context context, Camera camera) {
super(context);
mCamera = camera; // Install a SurfaceHolder.Callback so we get notified when the
// underlying surface is created and destroyed.
//获取surfaceview的控制器
mHolder = getHolder();
//设置侦听
mHolder.addCallback(this);
// deprecated setting, but required on Android versions prior to 3.0
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
} public void surfaceCreated(SurfaceHolder holder) {
// The Surface has been created, now tell the camera where to draw the preview.
try {
//设置摄像头的预览界面显示在holder对应的那个surfaceview
mCamera.setPreviewDisplay(holder);
//开始预览
mCamera.startPreview();
} catch (IOException e) {
Log.d(TAG, "Error setting camera preview: " + e.getMessage());
}
} public void surfaceDestroyed(SurfaceHolder holder) {
// empty. Take care of releasing the Camera preview in your activity.
} public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
// If your preview can change or rotate, take care of those events here.
// Make sure to stop the preview before resizing or reformatting it. if (mHolder.getSurface() == null){
// preview surface does not exist
return;
} // 在对surfaceview做改变前,先停止预览
try {
mCamera.stopPreview();
} catch (Exception e){
// ignore: tried to stop a non-existent preview
} // set preview size and make any resize, rotate or
// reformatting changes here // 设置改变完后,重新开始预览
try {
mCamera.setPreviewDisplay(mHolder);
mCamera.startPreview(); } catch (Exception e){
Log.d(TAG, "Error starting camera preview: " + e.getMessage());
}
}
}

CameraPreview

 package com.itheima.cameraapp;

 import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException; import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.PictureCallback;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.FrameLayout; public class MainActivity extends Activity { private Camera mCamera;
private CameraPreview mPreview; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); if(checkCameraHardware(this)){
// 创建摄像头实例
mCamera = getCameraInstance();
}
else{
return;
}
//创建预览类的对象
mPreview = new CameraPreview(this, mCamera);
FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
//把预览类设置为帧布局的子节点
preview.addView(mPreview); // 给按钮设置点击侦听
Button captureButton = (Button) findViewById(R.id.button_capture);
captureButton.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
//自动聚焦
mCamera.autoFocus(new AutoFocusCallback() { //聚焦完成调用
@Override
public void onAutoFocus(boolean success, Camera camera) {
// 拍照
mCamera.takePicture(null, null, mPicture); }
}); }
}
);
} /** 检测手机是否有摄像头 */
private boolean checkCameraHardware(Context context) {
//检测手机是否安装有摄像头应用
if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){
// this device has a camera
return true;
} else {
// no camera on this device
return false;
}
} /** 一个获取摄像头实例的安全途径 */
public static Camera getCameraInstance(){
Camera c = null;
try {
c = Camera.open(); // 获取第一个后置摄像头的实例
}
catch (Exception e){
// Camera is not available (in use or does not exist)
}
return c; // returns null if camera is unavailable
} private PictureCallback mPicture = new PictureCallback() { //拍照会调用此方法
//data:照片的字节数组
@Override
public void onPictureTaken(byte[] data, Camera camera) {
try {
File pictureFile = new File("sdcard/mrplus.jpg");
FileOutputStream fos = new FileOutputStream(pictureFile);
fos.write(data);
fos.close();
} catch (FileNotFoundException e) {
Log.d(CameraPreview.TAG, "File not found: " + e.getMessage());
} catch (IOException e) {
Log.d(CameraPreview.TAG, "Error accessing file: " + e.getMessage());
} finally{
//拍照完成后重新进入预览
camera.startPreview();
}
}
}; }

MainActivity

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.itheima.cameraapp"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.itheima.cameraapp.MainActivity"
android:label="@string/app_name"
android:screenOrientation="landscape"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application> </manifest>

AndroidManifest

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<FrameLayout
android:id="@+id/camera_preview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:visibility="invisible"
/> <Button
android:id="@+id/button_capture"
android:text="Capture"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
/>
</LinearLayout>

activity_main

android 学习随笔二十(多媒体编程 )的更多相关文章

  1. android 学习随笔二十九(自定义监听 )

    package com.itheima.momo.dialog; import com.itheima.momo.R; import android.app.AlertDialog; import a ...

  2. android 学习随笔二十八(应用小知识点小结 )

    去掉标题栏的方法 第一种:也一般入门的时候经常使用的一种方法requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏注意这句一定要写在setConte ...

  3. android 学习随笔二十六(动画:属性动画)

    属性动画,属性动画是真正改变对象的某个属性的值 * 补间动画,只是一个动画效果,组件其实还在原来的位置上,xy没有改变1.位移:* 第一个参数target指定要显示动画的组件* 第二个参数proper ...

  4. android 学习随笔二十五(动画:补间动画)

    补间动画(TweenAnimation) * 原形态变成新形态时为了过渡变形过程,生成的动画就叫补间动画(为了让对象从初始状态向结束状态改变的过程更加自然而自动生成的动画效果)* 位移.旋转.缩放.透 ...

  5. android 学习随笔二十四(动画:帧动画)

    帧动画,一张张图片不断的切换,形成动画效果 * 在drawable目录下定义xml文件,子节点为animation-list,在这里定义要显示的图片和每张图片的显示时长 * FrameAnimatio ...

  6. android 学习随笔二十二(小结)

    ADB进程 * adb指令 * adb install xxx.apk * adb uninstall 包名 * adb devices * adb start-server * adb kill-s ...

  7. android 项目学习随笔二十(屏幕适配)

    1.图片适配 放入相同名称的资源文件,机器根据不同分辨率找相近的资源 240*320 ldpi 320*480 mdpi 480*800 hdpi 720*1280 xhdpi 2.布局适配 在不同的 ...

  8. android 学习随笔二十一(内容提供者 )

    一.内容提供者* 应用的数据库是不允许其他应用访问的* 内容提供者的作用就是让别的应用访问到你的私有数据* 自定义内容提供者,继承ContentProvider类,重写增删改查方法,在方法中写增删改查 ...

  9. Android学习(二十二)ContentMenu上下文菜单

    一.上下问菜单 在某个菜单项上长按,会弹出一个菜单,这个就是上下文菜单.有点类似与Windows系统中的右键菜单. 二.上下文菜单的内容 1.标题 2.图标 3.菜单项 4.对应的菜单事件 三.Opt ...

随机推荐

  1. 注册表操作命令和自定义cmd窗口

    REM @echo offREM clsREM echo Microsoft Windows 7REM echo ------------------------REM echo Welcome to ...

  2. [BS-12] JSON的基础知识--百科

    JSON的基础知识--百科 http://baike.baidu.com/view/136475.htm

  3. Android Framework框架_转

    选自<Android内核剖析> Framework定义了客户端组件和服务端组件功能及接口.包含3个主要部分:服务端,客户端和Linux驱动. (一)服务端 服务端主要包含两个重要类,分别是 ...

  4. HQL的语言

    HQL: 是Hibernate Query Language的缩写 1.HQL查询 特点: 与SQL相似,SQL中的语法基本上都可以直接使用 SQL查询的是表和表中的列而HQL查询的是对象或者对象中的 ...

  5. canvas学习之制作动画

    html部分 ...... <body> <canvas id="myCanvas" width="400" height="400 ...

  6. D3D9 浮点精度的问题

    最近在对我们的渲染引擎进行优化的时候,发现一个奇怪的现象,因为我们做了Pre-Z(把比较大的物体先绘制一遍,这个时候关闭颜色写,只开启深度测试和写入,目的是为了减少后面一些不可见像素的计算.),面在绘 ...

  7. 关于django post表单

    CSRF verification failed. Request aborted. 默认会出现该状况,解决办法: 1. 使用requestcontext from django.template i ...

  8. CPU boot up过程

    1.   CPU0 BOOT CPU1 BOOT 通过IPC互相通信 2.   CPU1 BOOT 完后,loop,等待IPC from CPU0 3.   cpu0 写IPC通知CPU1,cpu1 ...

  9. CSS 中文字体的英文名称

    宋体 SimSun 黑体 SimHei 微软雅黑 Microsoft YaHei 微软正黑体 Microsoft JhengHei 新宋体 NSimSun 新细明体 PMingLiU 细明体 Ming ...

  10. MySQL单表最大限制

    想把一个项目的数据库导出来,然后倒入到自己熟悉的MySQL数据库中进行运行和调试.导出来后,发现sql文件整整有12G多大,忽然想起来,MySQL好像有个叫做容量限制的神奇特性,但是忘了上限是多少了, ...