小编And*_*w G的帖子

从图片回调中读取android jpeg EXIF元数据

背景:我正在为一个信使程序编写一个相机应用程序.我无法随时将捕获的图像保存到永久磁盘.相机必须支持所有方向.我的实现是熟悉的Surfaceview示例.我使用Display类来检测方向并相应地旋转相机.在takePicture jpeg回调中,我从byte []构造一个位图,以解决我遇到的一些宽高比问题:Camera API:跨设备问题

问题描述:在某些设备上,在ROTATION_270处拍摄的构造的位图(设备顺时针旋转90度)是颠倒的.到目前为止,似乎是三星.我只能假设相机可能是通过其他方式焊接或者是那种影响,但这既不是在这里也不是在那里.虽然我可以检查Bitmap是否是横向的,但我无法从逻辑上检查它是否是尺寸颠倒所以我需要访问EXIF数据.

Android提供了一个解析器这个http://developer.android.com/reference/android/media/ExifInterface.html但不幸的是它具有接受文件的单一构造......我没有,不想.直观地说,我可以为一个字节数组编写一个构造函数,但考虑到它们调用本机代码,这看起来真的很痛苦http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2 .1_r1 /安卓/媒体/ ExifInterface.java

我的问题有两个部分:

  1. 有没有人知道byte []数组是否包含完整的EXIF jpeg头数据,或者是通过BitmapFactory.decode(...)/ BitmapFactory.compress(...)的路径以某种方式添加?

  2. 如果此EXIF数据在字节数组中退出,我如何以可靠的方式解析方向信息?

编辑10/18/12

下面的pcans回答涉及我的问题的第2部分.正如我在下面的评论中指出的那样,如果你想使用该解析器,你必须将源代码合并到你的项目中.链接SO帖子中提到的更改已经在此处进行了转发:https://github.com/strangecargo/metadata-extractor

注意元数据提取器的更新版本可直接在Android上运行而无需修改,可通过Maven获得.

但是,至于第1部分,当我使用从takePicture获得的字节数组运行时,我从解析器返回0个标签.我开始担心字节数组没有我需要的数据.我将继续研究这一点,但欢迎任何进一步的见解.

java android jpeg exif

32
推荐指数
3
解决办法
5万
查看次数

Camera API:跨设备问题

我正在开发一个相机应用程序,基本上作为消息应用程序的一部分来附加图像等.该应用程序需要工作> = SDK 2.2和:

不能像我喜欢的那样使用默认的Android相机,因为:

  1. 该应用程序的性质决定了图像不应该保存到磁盘,一些OEM(三星)喜欢这样做而不给你一个选择.

  2. 我无法调用任何其他相机应用程序可以拦截的意图,因为那时该应用程序可以保存图像.

我目前的问题是处理Android相机显然不喜欢纵向的事实.具体来说,经过一些挖掘后,我正在监控显示屏,并在轮换时调用setDisplayOrientation(90).这可以工作,但是surfaceview维度也需要更改,这必须在支持的维度内完成,否则参数设置会使应用程序崩溃.

我正在使用我在这里找到的另一个SO片段(getBestPreviewSize()方法)这样做,但它有一个明显的问题,我无法相信我没有找到其他人.

该部分takePicture的生命周期涉及调用PostView图片回调.这将显示当前暂停SurfaceView图像的静止图像,该图像将通过byteArray返回到原始和/或jpeg回调.我的问题是,这个图像在一些看似随机的测试设备上仍然存在偏差!因此,行为是用户以完美的4:3宽高比看到动态相机图像,直到他们拍摄照片并且他们呈现的图像被压扁.请注意,字节数组本身是正确的,当我Bitmap在消息传递端点构造它时,它显示正常,但这仍然是一个问题.

此时我无法看到如何改变静止图像显示.谁能帮我这个?

java camera android

14
推荐指数
1
解决办法
1921
查看次数

Android内置版本的行为与通过USB安装的apk不同

我有一个非常令人困惑的问题.我已经构建了我的应用程序的最终版本APK,将其提交到Play商店,并安装在我的测试设备上.当我以这种方式安装时,应用程序展示了不同的启动模式行为.

我生成的APK是Gradle版本的产品,包括Proguard和zipalign.为了便于解释,请说我的应用程序是一个仪表板类型的应用程序,其主要活动显示活动B的启动按钮.我拿这个版本APK并通过USB'adb install'将其安装到我的设备所以我正在比较完全相同的APK有两种不同的安装方法.

USB方法: 当用户单击主活动中的按钮以启动活动B时,将启动活动B并在屏幕上显示.如果用户点击主页按钮(接到电话等)然后返回应用程序,活动B仍然显示.这是期望的(AND EXPECTED)行为.

存储方法: 从商店下载APK并再次安装/启动显示主要活动.单击该按钮时,将再次启动活动B. 现在,当用户回到主页并返回时,后面的堆栈显然被清除,主活动再次显示.

我没有在清单中指定任何特殊的启动模式,因此所有活动都是标准的.怎么安装方法会影响这样的事情!?这让我很生气.有没有人知道为什么会这样?

android android-intent apk google-play

14
推荐指数
1
解决办法
1046
查看次数

Linux网络堆栈:使用LKM和dev_add_pack添加协议

我最近一直在努力熟悉Linux网络堆栈和设备驱动程序(两者都有类似名称的O'Reilly书籍),最终目标是卸载UDP.我已经在网卡上实现了UDP,但现在很难实现......

我没有在这个更大的目标上寻求帮助,而是希望有人可以为我澄清一个特定的片段,我发现它是LKM的一部分,它注册了一个新的协议(OTP),充当设备驱动程序和网络堆栈之间的过滤器.

http://www.phrack.org/archives/55/p55_0x0c_Building%20Into%20The%20Linux%20Network%20Layer_by_lifeline%20&%20kossak.txt

(注意:这篇Phrack文章包含三个不同的模块,OTP的代码位于页面底部)

在他的例子的init函数中,他有:

    otp_proto.type = htons(ETH_P_ALL); 
    otp_proto.func = otp_func;
    dev_add_pack(&otp_proto);
Run Code Online (Sandbox Code Playgroud)

哪个(如果我理解正确的话)应该将otp_proto注册为数据包嗅探器并将其放入ptype_all数据结构中.我的问题是关于dev_add_pack.

注册为过滤器的协议是否总是放在L2和设备驱动程序之间的这一层?或者,例如,我可以使用相同的过程在应用程序层和传输层之间进行这样的过滤(分析套接字参数)吗?

如果这令人困惑,我很抱歉 - 当涉及到改变内核堆栈功能的模块时,我在绕着更大的图片时遇到了一些麻烦.

谢谢

networking module protocols linux-kernel

7
推荐指数
1
解决办法
4237
查看次数

std :: vector中的内存泄漏代表2D数据

我编写了一个简单的模板化Matrix类,用于操作数据基质的主应用程序.截断的Matrix代码是:

template <typename T> 
class Matrix{
   private:
      std::vector<T> matrixRepresentation;
      bool transposed;
  public: 
  Matrix(int r, int c);
  int maxRows;
  int maxCols;
  void setMatrixValue(int row, int col, T val);
  T getMatrixValue(int row, int col);
};

template <typename T>
Matrix<T>::Matrix(int r, int c){
   maxRows = r;
   maxCols = c;
   matrixRepresentation.resize((r+1)*(c+1));
}   

template <typename T>
void Matrix<T>::setMatrixValue(int row, int col, T val){
   matrixRepresentation[row + col*maxCols] = val;
}

template <typename T>
T Matrix<T>::getMatrixValue(int row, int col){
   return matrixRepresentation[row + col*maxCols];
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我只是将2D矩阵表示为向量,并提供包装方法来隐藏该事实.即使我将堆栈变量matrixRepresentation调整为

(r+1)(c+1)
Run Code Online (Sandbox Code Playgroud)

我最后在代码中遇到了内存损坏问题,valgrind告诉我以下内容: …

c++ valgrind memory-leaks

5
推荐指数
1
解决办法
298
查看次数