项目里集成了一个图片选择库,可以直接把拍的照片转化为ascii图
处理代码如下:
一个实现图片显示出代码格式的图,转换出来
效果如下 :
主要代码:
下面开始分析代码,首先根据图片像素灰度转为ascii字符,这在网上有现成的java代码,android上只需要改一点api就可以,代码如下。
public static Bitmap createAsciiPic(final String path, Context context) {
final String base = "#8XOHLTI)i=+;:,.";// 字符串由复杂到简单
// final String base = "#,.0123456789:;@ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";// 字符串由复杂到简单
StringBuilder text = new StringBuilder();
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics dm = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(dm);
int width = dm.widthPixels;
int height = dm.heightPixels;
Bitmap image = BitmapFactory.decodeFile(path); //读取图片
int width0 = image.getWidth();
int height0 = image.getHeight();
int width1, height1;
int scale = 7;
if (width0 <= width / scale) {
width1 = width0;
height1 = height0;
} else {
width1 = width / scale;
height1 = width1 * height0 / width0;
}
image = scale(path, width1, height1); //读取图片
//输出到指定文件中
for (int y = 0; y < image.getHeight(); y += 2) {
for (int x = 0; x < image.getWidth(); x++) {
final int pixel = image.getPixel(x, y);
final int r = (pixel & 0xff0000) >> 16, g = (pixel & 0xff00) >> 8, b = pixel & 0xff;
final float gray = 0.299f * r + 0.578f * g + 0.114f * b;
final int index = Math.round(gray * (base.length() + 1) / 255);
String s = index >= base.length() ? " " : String.valueOf(base.charAt(index));
text.append(s);
}
text.append("\n");
}
return textAsBitmap(text, context);
// return image;
}
相对于电脑端有无边无际的txt编辑框,android里text是有字数限制的,所以原始图片如果像素过多的话就要进行尺寸压缩。
而且textPaint的这个设置特别重要textPaint.setTypeface(Typeface.MONOSPACE);字体对效果的影响太大了,失之毫厘谬以千里,这是一个大坑,说多了都是时间。
我在项目里集成了一个图片选择库,可以直接把拍的照片转化为ascii图,碰到一个问题就是拍照图片拿到后都会自动旋转90度,很是困惑,虽然找到了处理方法,但系统为啥要作旋转处理,还请知道的大神告知原因。
/**
* 处理旋转后的图片
*
* @param originpath 原图路径
* @param context 上下文
* @return 返回修复完毕后的图片路径
*/
public static String amendRotatePhoto(String originpath, Context context) {
// 取得图片旋转角度
int angle = readPictureDegree(originpath);
// 把原图压缩后得到Bitmap对象
if (angle != 0) {
Bitmap bmp = getCompressPhoto(originpath);
Bitmap bitmap = rotaingImageView(angle, bmp);
return savePhotoToSD(bitmap, context);
} else {
return originpath;
}
}
用到的方法
public static int readPictureDegree(String path) {
int degree = 0;
try {
ExifInterface exifInterface = new ExifInterface(path);
int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
degree = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
degree = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
degree = 270;
break;
}
} catch (IOException e) {
e.printStackTrace();
}
return degree;
}
public static Bitmap rotaingImageView(int angle, Bitmap bitmap) {
Bitmap returnBm = null;
// 根据旋转角度,生成旋转矩阵
Matrix matrix = new Matrix();
matrix.postRotate(angle);
try {
// 将原始图片按照旋转矩阵进行旋转,并得到新的图片
returnBm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
} catch (OutOfMemoryError e) {
}
if (returnBm == null) {
returnBm = bitmap;
}
if (bitmap != returnBm) {
bitmap.recycle();
}
return returnBm;
}
这些代码都在文末的项目里。
按说拿到ascii图后,想要把整个视频转换成ascii字符视频就很简单了。只要把视频逐帧抽成图片,图片转换后,再合成为视频播放出来,但我视频库用的不多,希望有能力的朋友可以帮助完成最后一步。
最后,也希望朋友们能把一些有趣的想法实践到android项目中来,让搬砖之余,有更多的乐趣。
一个工具类下载地址:
https://download.csdn.net/download/filyths/10649704
搬砖使用方法:
调取安卓自带选择图片方法,调用图片,
CommonUtil.choosePhoto(this, PictureConfig.CHOOSE_REQUEST);//(工具类的)
选择成功后回调方法:
/**
* 返回的选择后图片方法
* @param requestCode
* @param resultCode
* @param data
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
if (requestCode == PictureConfig.CHOOSE_REQUEST) {
List selectList = PictureSelector.obtainMultipleResult(data);
String path = "";
if (selectList != null && selectList.size() > 0) {
LocalMedia localMedia = selectList.get(0);
if (localMedia.isCompressed()) {
path = localMedia.getCompressPath();
} else if (localMedia.isCut()) {
path = localMedia.getCutPath();
} else {
path = localMedia.getPath();
}
}
filepath = CommonUtil.amendRotatePhoto(path, MainActivity.this);
// imageView.setImageBitmap(BitmapFactory.decodeFile(filepath));
bitmap = CommonUtil.createAsciiPic(filepath, MainActivity.this);
imageView.setImageBitmap(bitmap);
}
}
}
这样就显示在ImageView上面了。
如果你想把显示的图片保存到你的手机里,调用方法
public void doSave(View view) {
CommonUtil.saveBitmap2file(bitmap, System.currentTimeMillis() + "", MainActivity.this);
}
这样就简单的完成了,然后你就可以跑你的项目看看了,然后去装装逼,给你的女朋友看看,当然 单身狗也可以拿去给朋友秀一波。。。