c++对大量图片进行序列化和反序列化

2024-04-10 14:19:07 +08:00
 h3xz
工作中开发的软件有这样一个需求:
程序用了某种算法对大量图片(约有 9 千多张,每张约 4M )进行了处理。我该怎么将这所有的图片以数组的形式序列化为一个文件夹,当从硬盘将这些图片读回内存时可以随机访问图片,以便用户第二次打开。
2582 次点击
所在节点    程序员
34 条回复
feirisu
2024-04-10 14:23:52 +08:00
没看懂
wangtian2020
2024-04-10 14:26:40 +08:00
不就是跟个系统自带的相册、或者说是图片查看器差不多吗。搞个缩略图差不多得了
xtreme1
2024-04-10 14:29:08 +08:00
意思是图片在内存里什么样就在文件里什么样?
存 PPM 呗
I3tZ9NgHU44xmaA4
2024-04-10 14:30:01 +08:00
9k 张图片也不多,我近千万张图片在电脑。
将所有文件的名字存在一个文本文件里就行了,随机到那个图片的名字再读哪个图片出来,我还是用弱鸡 C#弄的。
h3xz
2024-04-10 14:40:08 +08:00
感谢大家的回复。我没有表达清楚问题的意思,我是希望将所有的图片能够序列化到一个文件中(不是文件夹),我保存的不单单只有图片,还有与图片相关的一系列的数据,编号等,因此我想请教有没有这样一种第三方库:能够以将图片,数据,编号,日期作为一个对象进行序列化,我起初使用的是 protobuf ,但是该库不能序列化太大的文件 。如果采用的是读取图片的名称,用户一旦修改了图片名,那么读取图片就会出错了。非常感谢大家的建议。
xieym
2024-04-10 14:40:49 +08:00
sqlite?
h3xz
2024-04-10 14:42:20 +08:00
@xtreme1 我想的是每次都保存对象,这个对象包含了图片,编号,和一系列相关数据。
hitmanx
2024-04-10 14:49:57 +08:00
看不出来这个用例里面,图片和普通的二进制文件对于序列化有什么区别?你把图片想象成一个普通的二进制文件不就行了。
那么现在就是序列化一个 array 或者 map ,里面每个元素包含一些 metadata(number, string etc)和一个不定长的二进制文件。
F7TsdQL45E0jmoiG
2024-04-10 14:50:07 +08:00
这不就是对象存储干的事儿嘛
StrangerA
2024-04-10 14:51:40 +08:00
9k * 4M ,36 个 G 存入一个文件,还想瞬间读写?

建议存缩略图进 sqlite
jones2000
2024-04-10 14:52:16 +08:00
内存数据库
mxalbert1996
2024-04-10 14:53:40 +08:00
换个思路,直接把文件打包成一个不带压缩的 zip 文件。zip 文件是支持随机读取的。
3dwelcome
2024-04-10 15:01:15 +08:00
zip 文件可以,但是大小有一定限制,有 zip64 的变种,可以支持 4G 以上的大文件。
picone
2024-04-10 15:12:41 +08:00
记录 offset ,fseek 即可
leonshaw
2024-04-10 15:16:15 +08:00
在文件上建文件系统,mount
taygetus
2024-04-10 15:20:00 +08:00
#include <boost/serialization/map.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
linauror
2024-04-10 15:23:31 +08:00
如果要存的数据不多,直接把这些数据给图片命名呢,比如 xxxx_yyyy_20240101235959.jpg
shyrock
2024-04-10 15:39:44 +08:00
建议直接说原始需求,而不是你分析之后想要的算法。。。
shakeyo
2024-04-10 16:03:44 +08:00
简单点就 zip
麻烦点就自己设计一个文件格式,类似|magicNumber|version|indexOffset|fileOffset|
生成过程就是计算头,填充并依次将头、文件索引表、文件数据 1 ,文件数据 2 。。。。。写入到文件中
edward1987
2024-04-10 16:09:30 +08:00
确定需求是 [随机访问图片] 而不是 [随时访问图片] ? 怎么看着像是在做一个图文游戏,然后想用序列化的方式加密啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1031297

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX