如何将海量图片整理到到数据库中?
现实业务中,应用数据库通过筛选关键字就可以找到相对应的图片?
都需要怎么做呢?
先搭建数据库?
如何将数据和图片实现联动呢?
或者现在有什么成熟的软件或平台可以实现此类想法呢?
求各位指引~
在数据库设计一张表,字段包含主键,图片名称、图片描述、图片路径等相关信息,其中图片描述为text类型,存放图片关键字信息,
当筛选图片时,如果描述信息中包含关键字,就把图片对应的url取出来放到list中,直至筛选完成,最后将list返回给前端进行显示,望采纳
看需求功能的设计以及数据库搭建 倒不是什么难事,难的是海量的图片怎么去整理关键词。
无论你是什么数据库,先在后台建立一张表,
包含文件名、主键
不同的数据库有不同的数据类型,
sql server 有个IMage类型
其它数据库建议用BINARY /Blob
这种数据类型可以直接赋值给编程控件
实现联动的话,其它表用主键关联即可
例如主键命名为IMAGE_ID、其它表关联这个IMAGE_ID(也就是建立一个同样字段名,存储和图片IMAGE_ID同样的数据类型)
关联可以用函数,也可以用查询语句直接关联。
就看你的程序需不需要节约资源。
如果你的数据库不需要联网,我建议你使用sqlite数据库,这个数据库使用非常简易。并且能存储海量数据。
图片是肯定不能存入数据库的,存入数据库的只能是图片路径。将图片的一些属性,如名字,格式,图片路径等等存入数据库,当需要查询的时候。调用select命令进行查询,最后使用获取到的图片路径,然后进行显示
1.这里我先说一下思路,需求是要把海量的图片存储起来使用数据库可以快速的搜索到图片。这里搭建数据库是必须的,不然也没办法查询啊;
2.如果只需要根据图片名称进行查询,只需要递归获取到所有图片的路径,然后把图片信息存储到数据库中就可以了。
3.如果需要对图片进行分类,而且图片的类型要和图片相符合,那就需要通过图像识别分析是什么类型的图片了。而大量数据看具体数据量有多大了,如果是10万左右的数据使用常规的就可以,
4.如果是百万或者上千万的图片那就需要考虑一下使用什么架构了;
常规方案:
数据库使用mysql,语言都可以,存储图片可以不动位置,通过递归获取所有图片的路径,然后保存的数据库中(当然也包含图片的信息,如大小、名称、等),
如果需要给图片做分离可以通过图像识别来完成,可以看一下我的博客有开源的图像识别技术;
大数据量方案:
数据库可以使用oracle当然myslq也可以,语言使用java、c都可以,文件建议放到文件系统中可以方便查找,识别技术参考开源技术,
参考这个:https://blog.csdn.net/u011410254/article/details/51233830?utm_source=blogxgwz3
我的想法是,建数据库,里面存图像路径,名称等,然后与图像联动
可以用sqlite,有个image类型
1、我前两天刚做这样的业务,我的是用于将海量图片存到数据库,前端逐张显示出来进行打分,用的是springboot+vue,首先将图片批量上传到服务器并保存在mysql;
第一步新建springboot项目,然后配置数据库:
server:
port: 8081
spring:
#数据源配置
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver # mysql的驱动你可以配置别的关系型数据库
url: jdbc:mysql://localhost:3306/image_database?characterEncoding=UTF-8 #数据源地址
username: root # 用户名
password: root # 密码
图像数据库实体类
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
import lombok.experimental.Accessors;
/**
* 开发人员: Justin Fan
* 版本日志: 1.0
* 创建日期: 2022/3/23 17:11
* 功能描述: 图像及图像评分实体类
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Accessors(chain = true)
@TableName(value = "image" ) //默认将表名作为类名,如果一致可以省略不写
public class Image {
private int id;
@TableField(value = "image_content")
private Byte[] imageContent;
private float score;
private String url;
}
上传图片工具类
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.security.PrivateKey;
/**
* 开发人员: Justin Fan
* 版本日志: 1.0
* 创建日期: 2022/3/22 16:27
* 功能描述: 上传图片所用的工具类
*/
public class UploadUtils {
//定义一个目标路径,就是我们要把图片上传到的位置
private static final String BASE_PATH="E:\\研究生\\开题\\数据集\\绝缘子数据集\\InsulatorDataSet\\Normal_Insulators\\images";
//定义访问图片的路径
private static final String SERVER_PATH="http://localhost:8081/upload/";
//上传方法
public static String upload(MultipartFile file){
//获得上传文件的名称
String filename = file.getOriginalFilename();
//保证图片在存储时候的唯一性,需要用到工具方法UUIDUtils.getUUID()
String uuid = UUIDUtils.getUUID();
//将uuid和文件名字拼接
String newFilename = uuid + "_" + filename;
//创建一个文件实列对象
File image = new File(BASE_PATH, newFilename);
try {
file.transferTo(image);
} catch (IOException e) {
return null;
}
return SERVER_PATH+newFilename;
}
}
将图片路径全部保存到数据库
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.fyj.cn.dao.ImageDao;
import com.fyj.cn.entity.DataJSON;
import com.fyj.cn.entity.Image;
import com.fyj.cn.utils.UploadUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
/**
* 开发人员: Justin Fan
* 版本日志: 1.0
* 创建日期: 2022/3/22 16:52
* 功能描述: 用于上传文件的
*/
@Controller
@RequestMapping("upload")
public class UploadController {
@Resource
private ImageDao imageDao;
@RequestMapping("image")
@ResponseBody
public DataJSON uploadImage(@RequestParam(value = "file") MultipartFile[] multipartFile){
DataJSON dataJSON = null;
ArrayList<DataJSON> dataJSONList = new ArrayList<>();
for (MultipartFile file : multipartFile) {
//调用我们写的上传文件的工具类
String imagePath = UploadUtils.upload(file);
dataJSON = new DataJSON();
if (imagePath!=null){
dataJSON.setCode(200);
dataJSON.setMsg("上传成功");
HashMap<String, String> map = new HashMap<>();
map.put("src",imagePath);
dataJSON.setData(map);
String src = dataJSON.getData().get("src");
Image image = new Image();
image.setUrl(src);
imageDao.insert(image);
dataJSONList.add(dataJSON);
}else {
dataJSON.setCode(0);
dataJSON.setMsg("上传失败");
}
}
for (DataJSON dataJson : dataJSONList) {
System.out.println(dataJson);
}
return dataJSON;
}
}
2、用vue开发前端页面,用来显示图片,下面是效果,可以私信一起学习
深度学习实际系统架构中,图片数据是不直接存入数据库的,每张图像都将创建一个独立的id,然后在数据库以这个id未独立键值,然后其它的属性,比如场景、变迁、描述等就可以关联起来了