我通过uvc接收了一个流,它给了我每个mjpeg流。
将jpeg帧写入位图时,从调试器查看的字节数组如下所示:
{ 0, -128, 1, -128, 0, -128, .......}
我通过这样做来创建文件:
bitmap.copyPixelsFromBuffer(frame);
File file = new File(Constants.CAPTURE_PATH, System.currentTimeMillis() + ".jpeg");
file.createNewFile();
out = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
在我创建文件并使用十六进制查看器查看其内部后,文件如下所示:
FF D8 FF E0 00.....
这是否意味着{0}成为FF,而{-128}成为D8?
有什么规则可以解决这个问题?任何帮助都会非常感激。
答案 0 :(得分:2)
如果这些文件是文件十六进制查看器看到的文件中的第一个字节,则可能正在查看JPEG文件头。 FF D8 FF
看起来非常相似。例如,请参阅here和维基百科页面here。
我希望您在调试器中查看的数据是原始图像数据,不包含标题。
答案 1 :(得分:1)
在我们在评论中的简短对话之后,我觉得这是您正在寻找的信息。
您实际看到的是文件标题。标头本质上是一个文件开头的代码块,它告诉计算机它是什么,所以它知道如何处理它。
有关文件标题的更多信息:https://www.webopedia.com/TERM/H/header.html
现在,针对您的具体问题。使用jpegs(就像任何其他文件一样),他们有自己的标题和数据组织方式。 JPEG标头以FF D8
开头,jpeg文件阅读器表示SOI(图像开始)。然后转到FF E0
,这意味着APP0(应用程序段)。名单还在继续。
有关jpeg文件的更多信息:https://web.archive.org/web/20120403212223/http://class.ee.iastate.edu/ee528/Reading%20material/JPEG_File_Format.pdf
您需要做的是跳过标题并开始寻找您的“实际”数据。 jpeg文件头的一些棘手的部分是它们的大小不一样,所以你需要查找SOS(扫描开始)标记,如果我没有弄错并从那里开始。