当前位置: 首页 > news >正文

【批量获取图片信息】批量获取图片尺寸、海拔、分辨率、GPS经纬度、面积、位深度、等图片属性里的详细信息,提取出来后导出表格,基于WPF的详细解决方案

摄影工作室通常会有大量的图片素材,在进行图片整理和分类时,需要知道每张图片的尺寸、分辨率、GPS 经纬度(如果拍摄时记录了)等信息,以便更好地管理图片资源,比如根据图片尺寸和分辨率决定哪些图片适合用于大型海报,哪些适合用于网页展示。将这些信息导出表格后,可以方便地进行筛选、排序和统计。在地理信息相关的研究中,可能会收集大量带有 GPS 经纬度信息的图片,通过提取这些图片的属性信息并导出表格,可以对图片的分布区域、拍摄海拔等进行分析,从而辅助地理信息的研究和绘制地图等工作。

详细步骤

1. 创建 WPF 项目

首先,打开 Visual Studio,创建一个新的 WPF 应用程序项目。

2. 设计界面

MainWindow.xaml 文件中设计界面,添加必要的控件,如按钮用于选择图片文件夹,文本框用于显示文件夹路径,以及一个按钮用于导出表格。以下是一个简单的示例:

xml

<Window x:Class="ImageMetadataExtractor.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="Image Metadata Extractor" Height="350" Width="525"><Grid><Button Content="选择图片文件夹" HorizontalAlignment="Left" Margin="20,20,0,0" VerticalAlignment="Top" Width="150" Click="SelectFolderButton_Click"/><TextBox x:Name="FolderPathTextBox" HorizontalAlignment="Left" Height="23" Margin="180,20,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="300" IsReadOnly="True"/><Button Content="导出表格" HorizontalAlignment="Left" Margin="20,60,0,0" VerticalAlignment="Top" Width="150" Click="ExportTableButton_Click"/></Grid>
</Window>
3. 实现选择文件夹功能

MainWindow.xaml.cs 文件中,实现选择文件夹的功能。需要使用 System.Windows.Forms.FolderBrowserDialog 来选择文件夹,并将选择的文件夹路径显示在文本框中。

csharp

using System;
using System.IO;
using System.Windows;
using System.Windows.Forms;namespace ImageMetadataExtractor
{public partial class MainWindow : Window{private string selectedFolderPath;public MainWindow(){InitializeComponent();}private void SelectFolderButton_Click(object sender, RoutedEventArgs e){using (FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog()){DialogResult result = folderBrowserDialog.ShowDialog();if (result == System.Windows.Forms.DialogResult.OK){selectedFolderPath = folderBrowserDialog.SelectedPath;FolderPathTextBox.Text = selectedFolderPath;}}}}
}
4. 批量获取图片属性信息

使用 System.DrawingMetadataExtractor 库来获取图片的属性信息。MetadataExtractor 是一个强大的用于提取图片元数据的库,可以通过 NuGet 包管理器进行安装。以下是获取图片属性信息的代码:

csharp

using MetadataExtractor;
using MetadataExtractor.Formats.Exif;
using System.Collections.Generic;
using System.Drawing;private List<Dictionary<string, object>> GetImageMetadata(string folderPath)
{List<Dictionary<string, object>> metadataList = new List<Dictionary<string, object>>();string[] imageFiles = Directory.GetFiles(folderPath, "*.jpg;*.jpeg;*.png", SearchOption.AllDirectories);foreach (string imageFile in imageFiles){metadata["文件名"] = Path.GetFileName(imageFile);try{using (Image image = Image.FromFile(imageFile)){metadata["宽度"] = image.Width;metadata["高度"] = image.Height;metadata["分辨率X"] = image.HorizontalResolution;metadata["分辨率Y"] = image.VerticalResolution;metadata["位深度"] = image.PixelFormat.ToString();}var directories = ImageMetadataReader.ReadMetadata(imageFile);var gpsDirectory = directories.OfType<GpsDirectory>().FirstOrDefault();if (gpsDirectory != null){if (gpsDirectory.ContainsTag(GpsDirectoryBase.TagLatitude) && gpsDirectory.ContainsTag(GpsDirectoryBase.TagLongitude)){var latitude = gpsDirectory.GetGeoLocation().Latitude;var longitude = gpsDirectory.GetGeoLocation().Longitude;metadata["GPS纬度"] = latitude;metadata["GPS经度"] = longitude;}if (gpsDirectory.ContainsTag(GpsDirectoryBase.TagAltitude)){metadata["海拔"] = gpsDirectory.GetDouble(GpsDirectoryBase.TagAltitude);}}// 图片面积(简单计算为宽度 * 高度)metadata["面积"] = (int)metadata["宽度"] * (int)metadata["高度"];}catch (Exception ex){metadata["错误信息"] = ex.Message;}metadataList.Add(metadata);}return metadataList;
}
5. 导出表格

使用 Microsoft.Office.Interop.Excel 库将获取到的图片属性信息导出到 Excel 表格中。同样,可以通过 NuGet 包管理器安装相关依赖。以下是导出表格的代码:

csharp

using Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;private void ExportTableButton_Click(object sender, RoutedEventArgs e)
{if (string.IsNullOrEmpty(selectedFolderPath)){MessageBox.Show("请先选择图片文件夹!");return;}var metadataList = GetImageMetadata(selectedFolderPath);var excelApp = new Application();var workbook = excelApp.Workbooks.Add();var worksheet = workbook.ActiveSheet;// 写入表头var headers = new List<string> { "文件名", "宽度", "高度", "分辨率X", "分辨率Y", "位深度", "GPS纬度", "GPS经度", "海拔", "面积", "错误信息" };for (int i = 0; i < headers.Count; i++){worksheet.Cells[1, i + 1] = headers[i];}// 写入数据for (int i = 0; i < metadataList.Count; i++){var metadata = metadataList[i];for (int j = 0; j < headers.Count; j++){if (metadata.ContainsKey(headers[j])){worksheet.Cells[i + 2, j + 1] = metadata[headers[j]];}}}// 保存文件SaveFileDialog saveFileDialog = new SaveFileDialog();saveFileDialog.Filter = "Excel文件 (*.xlsx)|*.xlsx";if (saveFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK){workbook.SaveAs(saveFileDialog.FileName);MessageBox.Show("表格导出成功!");}// 释放资源workbook.Close();excelApp.Quit();Marshal.ReleaseComObject(worksheet);Marshal.ReleaseComObject(workbook);Marshal.ReleaseComObject(excelApp);
}
6. 运行程序

编译并运行程序,点击 “选择图片文件夹” 按钮选择包含图片的文件夹,然后点击 “导出表格” 按钮,选择保存路径,即可将图片属性信息导出到 Excel 表格中。

通过以上步骤,你可以实现批量获取图片属性信息并导出表格的功能。

相关文章:

【批量获取图片信息】批量获取图片尺寸、海拔、分辨率、GPS经纬度、面积、位深度、等图片属性里的详细信息,提取出来后导出表格,基于WPF的详细解决方案

摄影工作室通常会有大量的图片素材&#xff0c;在进行图片整理和分类时&#xff0c;需要知道每张图片的尺寸、分辨率、GPS 经纬度&#xff08;如果拍摄时记录了&#xff09;等信息&#xff0c;以便更好地管理图片资源&#xff0c;比如根据图片尺寸和分辨率决定哪些图片适合用于…...

数据结构与算法(test3)

七、查找 1. 看图填空 查找表是由同一类型的数据元素&#xff08;或记录&#xff09;构成的集合。例如上图就是一个查找表。 期中&#xff08;1&#xff09;是______________. (2)是______________(3)是_____关键字_______。 2. 查找(Searching) 就是根据给定的某个值, 在查…...

基于Python的人工智能驱动基因组变异算法:设计与应用(下)

3.3.2 数据清洗与预处理 在基因组变异分析中,原始数据往往包含各种噪声和不完整信息,数据清洗与预处理是确保分析结果准确性和可靠性的关键步骤。通过 Python 的相关库和工具,可以有效地去除噪声、填补缺失值、标准化数据等,为后续的分析提供高质量的数据基础。 在基因组…...

C++ 顺序表

顺序表的操作有以下&#xff1a; 1 顺序表的元素插入 给定一个索引和元素&#xff0c;这个位置往后的元素位置都要往后移动一次&#xff0c;元素插入的步骤有以下几步 &#xff08;1&#xff09;判断插入的位置是否合法&#xff0c;如果不合法则抛出异常 &#xff08;2&…...

Mac(m1)本地部署deepseek-R1模型

1. 下载安装ollama 直接下载软件&#xff0c;下载完成之后&#xff0c;安装即可&#xff0c;安装完成之后&#xff0c;命令行中可出现ollama命令 2. 在ollama官网查看需要下载的模型下载命令 1. 在官网查看deepseek对应的模型 2. 选择使用电脑配置的模型 3. copy 对应模型的安…...

Docker 部署 redis | 国内阿里镜像

一、简易单机版 1、镜像拉取 # docker hub 镜像 docker pull redis:7.0.4-bullseye # 阿里云镜像 docker pull alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/redis_optimized:20240221-6.2.7-2.3.0 2、运行镜像 docker run -itd --name redis \n …...

48V电气架构全面科普和解析:下一代智能电动汽车核心驱动

48V电气架构&#xff1a;下一代智能电动汽车核心驱动 随着全球汽车产业迈入电动化、智能化的新时代&#xff0c;传统12V电气系统逐渐暴露出其无法满足现代高功率需求的不足。在此背景下&#xff0c;48V电气架构应运而生&#xff0c;成为现代电动汽车&#xff08;EV&#xff09…...

滤波器截止频率的计算

1、RC低通滤波器 图1.1 RC低通滤波器 RC低通滤波器如图1.1所示&#xff0c;电阻R串联电容C&#xff0c;输入电压记为Ui &#xff0c;输出电压记为Uo。 电容容抗记为&#xff0c;其中ω 2πf。 根据串联分压&#xff0c;列出传递函数。 将①式最右侧的分子与分母各乘以1-jω…...

服务器绑定 127.0.0.1 和 0.0.0.0 的区别

前言 IP 地址实际上并不是分配给计算机的&#xff0c;而是分配给网卡的&#xff0c;因此当计算机上存在多块网卡时&#xff0c;每一块网卡都会有自己的 IP 地址。 绑定 127.0.0.1 是绑定到 lookback 这个虚拟的本地回环接口&#xff0c;该接口只处理本机上的数据&#xff0c;…...

DeepSeek提示词手册

一、核心原则&#xff1a;基于DeepSeek的推理特性 自然语言优先undefinedDeepSeek擅长理解自然表达&#xff0c;无需复杂模板。例如&#xff1a; ❌旧模板&#xff1a;"你是专业分析师&#xff0c;需分三步回答&#xff0c;第一步…" ✅高效提问&#xff1a;"…...

校园网规划方案

个人博客站—运维鹿: http://www.kervin24.top CSDN博客—做个超努力的小奚&#xff1a; https://blog.csdn.net/qq_52914969?typeblog 本课程设计参考学习计算机网络 思科Cisco Packet Tracer仿真实验_哔哩哔哩_bilibili, 文章和pkg详见个人博客站: http://www.kervin24.to…...

python怎么求 一个数是否包含3

python求一个数包含3的方法&#xff1a; 1、使用“for i in 列表名”循环遍历列表中的每一个元素并将每个元素用str()函数转换成字符串格式 2、用“if str(3) in i”判断该元素中是否含有3 完整代码如下&#xff1a; 执行结果如下&#xff1a;...

ARM RFEIA指令作用

FreeRTOS第一个任务如何run起来的 在给ARM cortex R5适配FreeRTOS的过程中&#xff0c;在执行第一个task时&#xff0c;都是使用vTaskStartScheduler()函数&#xff0c;把第一个task运行起来的&#xff0c;其中比较关键在port.c实现的xPortStartScheduler()函数中&#xff0c;…...

【Kubernetes】常用命令全解析:从入门到实战(上)

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Kubernetes航线图&#xff1a;从船长到K8s掌舵者》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Kubernetes简介 2、安装Kubernetes …...

项目实战(11)-双通道气体压力计V1.0

一. 产品简介&#xff1a; 1、项目背景是在实际应用中需要监控通道内气体的压力&#xff0c;压力计分为两个通道&#xff1b;通道一时实时监控&#xff1b;通道二是保压&#xff0c;设定保压值得上下限后通道内得气体压力值会一直保持在这个范围内。 二. 应用场景&#xff1a…...

Node.js怎么调用到打包的python文件呢

在 Node.js 中调用打包后的 Python 可执行文件&#xff08;如 PyInstaller 生成的 .exe 或二进制文件&#xff09;&#xff0c;可以通过以下步骤实现&#xff1a; 一、Python 打包准备 假设已有打包好的 Python 文件 your_script.exe&#xff08;以 Windows 为例&#xff09;&…...

Transformer 详解:了解 GPT、BERT 和 T5 背后的模型

目录 什么是 Transformer? Transformer如何工作? Transformer 为何有用? 常见问题解答:机器学习中的 Transformer 在技​​术领域,突破通常来自于修复损坏的东西。制造第一架飞机的人研究过鸟类。莱特兄弟观察了秃鹫如何在气流中保持平衡,意识到稳定性比动力更重要。…...

利用二分法进行 SQL 盲注

什么是sql注入&#xff1f; SQL 注入&#xff08;SQL Injection&#xff09;是一种常见的 Web 安全漏洞&#xff0c;攻击者可以通过构造恶意 SQL 语句来访问数据库中的敏感信息。在某些情况下&#xff0c;服务器不会直接返回查询结果&#xff0c;而是通过布尔值&#xff08;Tr…...

如何通过 bugreport 分析 Android 系统日志?

&#x1f4e2; 1. 职业规划篇 来聊聊安卓职业规划&#xff1f;整机开发大专能做么&#xff1f; &#x1f4e2; 2.基础篇 基础篇.前言 基础篇.编译环境搭建 基础篇.源码目录简介 基础篇.系统 mk_bp 讲解 基础篇.开机动画定制 基础篇.定制桌面壁纸、导航方式 基础篇.系统属性、ap…...

安防机器人电源解决方案

安防机器人电源方案简介 随着安防机器人领域技术的不断进步,越来越多的新型传感器,特别是激光雷达(光探测与测距)的广泛应用,以及先进的板载AI处理器的加入,使得机器人能够更加安全、智能地与人类进行互动。然而,这也对机器人的电源系统提出了更高的要求。某安防机器人…...

内网穿透的应用-Ubuntu本地Docker搭建pichome文件管理系统打造个人云相册

文章目录 前言1.关于pichome2.本地部署pichome3.简单使用pichome4. 安装内网穿透5.配置pichome公网地址6. 配置固定公网地址 前言 你是不是也经常遇到这样的尴尬&#xff1a;手机、电脑里堆满了照片和视频&#xff0c;想找一张特定的图片时却像在大海捞针一样无从下手&#xf…...

力扣-栈与队列-1047 删除字符串中的所有相邻重复项

思路 利用栈更新紧邻的元素&#xff0c;和要插入的元素作比较 代码 class Solution { public:string removeDuplicates(string s) {if(s.size() < 2) return s;stack<char> st;st.push(s[0]);for(int i 1; i < s.size(); i){if(!st.empty() && s[i] s…...

旅客服务系统(PSS, Passenger Service System)

1. 系统概述 1.1 系统目标 旅客服务系统(PSS)旨在为旅客提供一站式航空服务,涵盖航班信息查询、机票预订、值机办理、行李托运、订单管理、支付集成等功能。系统通过模块化设计和分布式架构,确保高可用性、高性能、可扩展性和安全性,满足航空公司和旅客的多样化需求。 …...

Linux路径中的‘~‘

本文来自DeepSeek 在Linux中&#xff0c;~ 是用户主目录的简写。具体含义如下&#xff1a; 当前用户的主目录&#xff1a; ~ 代表当前登录用户的主目录。例如&#xff0c;用户 alice 的主目录通常是 /home/alice&#xff0c;~ 就指向 /home/alice。 其他用户的主目录&#xff…...

认识网络安全

一 网络攻击链 踩点-工具准备-载荷投递-漏洞利用-释放载荷-建立通道-目标达成 简化下&#xff1a; 目标侦察&#xff1a;准确识别目标&#xff0c;收集目标详细信息&#xff0c;比如 网络、 邮箱、员工、社会关系、对外提供服务、漏洞 信息等&#xff0c;为 后续攻击做准备。…...

信息科技伦理与道德3-3:智能决策

2.3 智能控制 智能控制算法介绍 智能控制算法的优化&#xff1a;性能提升的秘诀 https://blog.csdn.net/universsky2015/article/details/137309308 案例一&#xff1a;特斯拉自动驾驶汽车未能识别白色卡车导致车祸...

以 Python 为工具搭建的热门旅游景点数据分析系统

系统介绍&#xff1a; 随着计算机技术的飞速发展&#xff0c;计算机系统的应用已广泛渗透到社会的各个领域。大数据的大量应用为人们的生活带来了极大的便利。在此背景下&#xff0c;将热门旅游景点数据分析管理与互联网相结合&#xff0c;利用计算机搭建热门旅游景点数据分析…...

ZooKeeper 技术全解:概念、功能、文件系统与主从同步

引言 随着分布式系统变得越来越复杂&#xff0c;对协调服务的需求也在不断增长。ZooKeeper 作为一个由 Apache 维护的开源分布式协调服务框架&#xff0c;广泛用于 Hadoop 生态系统和其他需要协调的分布式环境中。这一系统旨在解决分布式应用中常见的挑战&#xff0c;如配置管…...

Visual Studio Code 的 AI 编程助手

文章目录 1. 写在最前面2. AI 编程助手2.1 Top 10 AI Extensions for Visual Studio Code2.1.1 脑图概括2.1.2 详细介绍 2.2 10 Best AI Code Tools: Quick and Easy Guide (2024)2.2.1 脑图概括2.2.2 详细介绍 3. Cody 插件试用4. 碎碎念5. 参考资料 1. 写在最前面 最近在研究…...

Kafka的ISR是什么,HW是什么,怎么保证可靠性,Kafka怎么实现顺序消息?为什么Kafka的broker上的topic越多,效率越慢?

目录 1. Kafka 的 ISR 是什么 2. Kafka 的 HW 是什么 3. Kafka 如何保证可靠性 4. Kafka 怎么实现顺序消息 5. 为什么 Kafka 的 broker 上的 topic 越多,效率越慢 1. Kafka 的 ISR 是什么 ISR 即 In-Sync Replicas(同步副本集),是 Kafka 中一个重要的概念,用于保障消…...