http://my.oschina.net/jingshishengxu/blog/36412

长度:

方法1:Paint.getTextWidths(text, widths)

方法2:Rect rect = new Rect();

pFont.getTextBounds(text, 0, text.length(), rect);

width=rect.width();

高度:

m_txtPaint.getFontMetrics().descent - m_txtPaint.getFontMetrics().ascent

http://www.cnblogs.com/error404/archive/2013/01/25/2876888.html

Paint pFont = new Paint();
Rect rect = new Rect();
pFont.getTextBounds("豆", 0, 1, rect);
Log.v(TAG, "height:"+rect.height()+"width:"+rect.width());

红蓝3d图片制作原理:

http://blog.csdn.net/iamsheldon/article/details/8011688

人眼分左右,红蓝3D图片实际是两种不同角度拍摄的两种图片合成的。

ps制作红蓝3d图片

http://jingyan.baidu.com/article/cbcede072c268c02f40b4d26.html

如何制作?:

http://www.scec.org/geowall/makeanaglyph.html

左边图片只提取红色,右边图片提取绿、蓝色,左图片左移一段距离,重叠上右图,最终合成红蓝3D图片。

上文描述了原理,下面是NDK合成红蓝3D图片的代码:

/**
红蓝图片合成
左边图片,自动取红色
右边图片,自动取绿蓝色
目标生成图片,必须和右边图片尺寸一样
两图片间的左右距离
by touch_ping
**/
JNIEXPORT void JNICALL Java_com_george_jni_PUtilJni_createRedBlue3DPic(JNIEnv *env, jclass clazz, jobject leftBitmap_Red,jobject rightBitmap_GreenBlue,jobject tagBitmap,jint distent) {JNIEnv J = *env;if (leftBitmap_Red == NULL) {J->ThrowNew(env, J->FindClass(env, "java/io/IOException"), "leftBitmap_Red is null");return;}if (rightBitmap_GreenBlue == NULL) {J->ThrowNew(env, J->FindClass(env, "java/io/IOException"), "rightBitmap_GreenBlue is null");return;}if (tagBitmap == NULL) {J->ThrowNew(env, J->FindClass(env, "java/io/IOException"), "tagBitmap is null");return;}// Get bitmap infoAndroidBitmapInfo lInfo;memset(&lInfo, 0, sizeof(lInfo));AndroidBitmap_getInfo(env, leftBitmap_Red, &lInfo);// Check format, only RGB565 & RGBA are supportedif (lInfo.width <= 0 || lInfo.height <= 0 ||(lInfo.format != ANDROID_BITMAP_FORMAT_RGB_565 && lInfo.format != ANDROID_BITMAP_FORMAT_RGBA_8888)) {LOGI("invalid bitmap:leftBitmap_Red\n");J->ThrowNew(env, J->FindClass(env, "java/io/IOException"), "invalid bitmap");return;}//format 4==565//format 1==8888// Lock the bitmap to get the buffervoid * lPixels = NULL;int res = AndroidBitmap_lockPixels(env, leftBitmap_Red, &lPixels);if (lPixels == NULL) {LOGI("fail to lock bitmap: %d\n", res);J->ThrowNew(env, J->FindClass(env, "java/io/IOException"), "fail to open bitmap");return;}LOGI("lBitmap Effect: %dx%d, %d\n", lInfo.width, lInfo.height, lInfo.format);// Get bitmap infoAndroidBitmapInfo rInfo;memset(&rInfo, 0, sizeof(rInfo));AndroidBitmap_getInfo(env, rightBitmap_GreenBlue, &rInfo);// Check format, only RGB565 & RGBA are supportedif (rInfo.width <= 0 || rInfo.height <= 0 ||(rInfo.format != ANDROID_BITMAP_FORMAT_RGB_565 && rInfo.format != ANDROID_BITMAP_FORMAT_RGBA_8888)) {LOGI("invalid bitmap:rightBitmap_GreenBlue\n");J->ThrowNew(env, J->FindClass(env, "java/io/IOException"), "invalid bitmap");return;}// Lock the bitmap to get the buffervoid * rPixels = NULL;res = AndroidBitmap_lockPixels(env, rightBitmap_GreenBlue, &rPixels);if (rPixels == NULL) {LOGI("fail to lock bitmap: %d\n", res);J->ThrowNew(env, J->FindClass(env, "java/io/IOException"), "fail to open bitmap");return;}LOGI("rBitmap Effect: %dx%d, %d\n", rInfo.width, rInfo.height, rInfo.format);// Get bitmap infoAndroidBitmapInfo tInfo;memset(&tInfo, 0, sizeof(tInfo));AndroidBitmap_getInfo(env, tagBitmap, &tInfo);// Check format, only RGB565 & RGBA are supportedif (tInfo.width <= 0 || tInfo.height <= 0 ||(tInfo.format != ANDROID_BITMAP_FORMAT_RGB_565 && tInfo.format != ANDROID_BITMAP_FORMAT_RGBA_8888)) {LOGI("invalid bitmap:tagBitmap\n");J->ThrowNew(env, J->FindClass(env, "java/io/IOException"), "invalid bitmap");return;}// Lock the bitmap to get the buffervoid * tPixels = NULL;res = AndroidBitmap_lockPixels(env, tagBitmap, &tPixels);if (tPixels == NULL) {LOGI("fail to lock bitmap: %d\n", res);J->ThrowNew(env, J->FindClass(env, "java/io/IOException"), "fail to open bitmap");return;}LOGI("tagBitmap Effect: %dx%d, %d\n", tInfo.width, tInfo.height, tInfo.format);if (tInfo.format != rInfo.format || tInfo.format != lInfo.format) {J->ThrowNew(env, J->FindClass(env, "java/io/IOException"), "the format is not same");return;}int x = 0, y = 0;// From top to bottomfor (y = 0; y < tInfo.height; ++y) {// From left to rightfor (x = 0; x < tInfo.width; ++x) {int a = 255, r = 0, g = 0, b = 0;void *Lpixel = NULL;void *Rpixel = NULL;void *Tpixel = NULL;// Get each pixel by format//红色int mx = x + distent;if (mx < lInfo.width) {if (lInfo.format == ANDROID_BITMAP_FORMAT_RGB_565) {Lpixel = ((uint16_t *)lPixels) + y * lInfo.width + mx;uint16_t v = *(uint16_t *)Lpixel;r = RGB565_R(v);} else {// RGBALpixel = ((uint32_t *)lPixels) + y * lInfo.width + mx;uint32_t v = *(uint32_t *)Lpixel;r = RGBA_R(v);}//                     LOGI("red: %d %d, %d\n", x, y, r);} else {r=0;}//绿色和蓝色if (rInfo.format == ANDROID_BITMAP_FORMAT_RGB_565) {Rpixel = ((uint16_t *)rPixels) + y * rInfo.width + x;uint16_t v = *(uint16_t *)Rpixel;g = RGB565_G(v);b = RGB565_B(v);} else {// RGBARpixel = ((uint32_t *)rPixels) + y * rInfo.width + x;uint32_t v = *(uint32_t *)Rpixel;g = RGBA_G(v);b = RGBA_B(v);}
//                                  LOGI("gb: %d %d, %d %d \n", x, y, g,b);//目标图片if (tInfo.format == ANDROID_BITMAP_FORMAT_RGB_565) {Tpixel = ((uint16_t *)tPixels) + y * tInfo.width + x;} else {// RGBATpixel = ((uint32_t *)tPixels) + y * tInfo.width + x;}//预测 真实//r    b//g    g// Write the pixel backif (tInfo.format == ANDROID_BITMAP_FORMAT_RGB_565) {*((uint16_t *)Tpixel) = MAKE_RGB565(r, g, b);} else {// RGBA*((uint32_t *)Tpixel) = MAKE_RGBA(r, g, b, a);}}}AndroidBitmap_unlockPixels(env, leftBitmap_Red);
AndroidBitmap_unlockPixels(env, rightBitmap_GreenBlue);AndroidBitmap_unlockPixels(env, tagBitmap);}

转载请注明出处。

6.22 android计算字符高度宽度,红蓝3D图片的制作原理及NDK生成实现相关推荐

  1. UI交互设计:红绿立体图片的制作

    UI交互设计:红绿立体图片的制作 文章目录 UI交互设计:红绿立体图片的制作 实验原理 python之openCV 实验流程 一.怎么拥有python(老鸟请跳过) 二.怎么安装openCV 三.写点 ...

  2. 用红蓝3D眼镜在PC上观看3D影片效果并不好

    如题,最近试了一下买了副红蓝分色3D眼镜.结果戴上以后放3D蓝光盘只有在画面的静态部分才能正确融像,画面上的物体一动起来马上两个像就不能正确融合,而是红色部分和蓝色部分直接混在一起闪来闪去.网上找了一 ...

  3. 【图文教程】用“iz3d”软件将您的游戏打造为红蓝3D游戏。

    iz3d是一款能将普通3D游戏转换为红蓝3D游戏的软件.基本上支持所有游戏,或许没用过的人会认为这只是类似于播放器中的一个小功能,将平面图形做成"伪3D"红蓝效果. 实际上不是的, ...

  4. 红青3D立体图像的原理

    人类是通过左眼和右眼所看到的物体的细微差异来获得立体感的,要从一幅平面的图像中获得立体感,那么这幅平面的图像中就必须包含具有一定视差的两幅图像的信息,再通过适当的方法和工具分别传送到我们的左右眼睛. ...

  5. 如何制作红蓝3d电影(详细教程)

    自20世纪初以来,电影制作人一直试图通过制作3D电影来利用我们的双眼.现在,由于大量相对实惠的3D电视,你可以享受电影院以外的额外空间 - 你自己拍摄的视频. 对于大预算的电影,电影摄影师使用两个相连 ...

  6. iOS 手记 - 计算文字高度/宽度:- (CGSize)sizeWithAttributes:(NSDictionaryNSString *,id *)attrs...

    计算NSString 的 size: - (CGSize)sizeWithAttributes:(NSDictionary<NSString *,id> *)attrs: Paramete ...

  7. 红绿3d眼镜与红蓝3d眼镜区别_Rokid X 非白三维,AR眼镜 + 3D扫描

    2020年1月,Rokid创始人兼CEO祝铭明在杭州发布了最新一代AR眼镜RokidGlass 2.这款性能强大的AR眼镜,不仅适用于安防.工业.教育等多个场景,还能够与三维扫描有机结合. Rokid ...

  8. 让VLC播放器支持SDS 3D视频转换成interlaced 3D视频(红蓝3D)

    插件 VLC HSBS to interlaced 3D plugin 经过测试不能使用,2013年作者就弃坑了. 幸运的是,VLC自带此功能. VLC, since version 2.1.0, i ...

  9. 由左右眼图片合成红蓝/红青立体图

    一个图片可以分解为RGB(红绿蓝)三个通道.红蓝立体图片原理就是将左右两个视角的图片合成,红蓝3D眼镜的左眼镜片是红色的,所以将左视角图片的红色通道降低或者去掉,同理去掉右视角图片的蓝色通道,然后合成 ...

  10. Android获取屏幕宽度高度并动态设置控件宽度,比例等

    1.Android获取屏幕宽度的几种方法: //1.通过WindowManager获取DisplayMetrics dm = new DisplayMetrics();int heigth = dm. ...

最新文章

  1. RandomForest:随机森林预测生物标记biomarker——回归
  2. Java 时间日期整理
  3. 模态对话框和非模态对话框区别
  4. 【计蒜客 - 蓝桥训练】修建公路(贪心,或运算,dp)
  5. SpringMVC整合MongoDB开发 架构搭建
  6. pytorch---nn模块(3)自定义nn 模块
  7. [渝粤教育] 中国地质大学 高层建筑施工 复习题 (2)
  8. Web前端之HTML取色器
  9. Excel表格中正数设置为红色负为绿色
  10. Intel无线网卡AX210驱动bug
  11. 大数据平台docker一键搭建
  12. 互联网快讯:龙佰集团冲刺港交所;极米Z6X Pro、极米H3S持续热销;京东物流调集3246人增援上海
  13. 河北外国语学院计算机宿舍,2021年河北外国语学院新生宿舍条件和宿舍环境图片...
  14. r语言进行go富集分析_GO富集柱状图
  15. Cortex-M3 处理器内核
  16. 小Hi和小Ho的礼物
  17. 软件发明专利实例_申请软件发明专利的一些案例
  18. Windows游戏编程快速入门方法
  19. 弹性盒子flex轴的说明
  20. 360以安全之名做搜索,可信,还是欺世盗名?

热门文章

  1. git memery 后 push到远程,如何回滚
  2. 工业触摸一体机的触摸屏原理和维护
  3. 2018年世界计算机超算大赛,2018ASC世界大学生超算竞赛开赛:11队齐破赛会纪录...
  4. win10 无法查看工作组计算机名,win10系统无法查看工作组计算机的技巧
  5. springmvc mybatis shiro springsecurity lucene restful webservice bootstrap html5
  6. 武侯计算机实验小学小升初,2018年成都小学升初中划片最新版!(含2017年对比)...
  7. 服务器显示日志已满,解决db2事务日志已满及日志磁盘空间已满问题办法详解
  8. HTB打靶日记:Soccer
  9. Photoshop抠图(用调整边缘命令抠图)
  10. JAVA金额大小写转换