【批量获取图片信息】批量获取图片尺寸、海拔、分辨率、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 表格中。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/967648.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何使用C++将处理后的信号保存为PNG和TIFF格式

在信号处理领域&#xff0c;我们常常需要将处理结果以图像的形式保存下来&#xff0c;方便后续分析和展示。C提供了多种库来处理图像数据&#xff0c;本文将介绍如何使用stb_image_write库保存为PNG格式图像以及使用OpenCV库保存为TIFF格式图像。 1. PNG格式保存 使用stb_ima…

【机器学习】超参数的选择,以kNN算法为例

分类准确度 一、摘要二、超参数的概念三、调参的方法四、实验搜索超参数五、扩展搜索范围六、考虑距离权重的kNN算法七、距离的计算方法及代码实现八、明可夫斯基距离的应用九、网格搜索超参数 一、摘要 本博文讲解了机器学习中的超参数问题&#xff0c;以K近邻算法为例&#…

使用PyCharm进行Django项目开发环境搭建

如果在PyCharm中创建Django项目 1. 打开PyCharm&#xff0c;选择新建项目 2.左侧选择Django&#xff0c;并设置项目名称 3.查看项目解释器初始配置 4.新建应用程序 执行以下操作之一&#xff1a; 转到工具| 运行manage.py任务或按CtrlAltR 在打开的manage.pystartapp控制台…

【python】matplotlib(animation)

文章目录 1、matplotlib.animation1.1、FuncAnimation1.2、修改 matplotlib 背景 2、matplotlib imageio2.1、折线图2.2、条形图2.3、散点图 3、参考 1、matplotlib.animation 1.1、FuncAnimation matplotlib.animation.FuncAnimation 是 Matplotlib 库中用于创建动画的一个…

IntelliJ IDEA使用经验(十三):使用Git克隆github的开源项目

文章目录 问题背景办法1、设置git代理&#xff1b;2、再次克隆项目&#xff1b;3、再次按常规方式进行git克隆即可。 问题背景 由于github在国外&#xff0c;很多时候我们在使用idea克隆开源项目的时候&#xff0c;没办法检出&#xff0c;提示 连接重置。 办法 1、设置git代…

人工智能学习(七)之神经网络

目录 一、引言 二、经典神经网络回顾 &#xff08;一&#xff09;结构与计算过程 &#xff08;二&#xff09;局限性 三、循环神经网络&#xff08;RNN&#xff09;原理 &#xff08;一&#xff09;基本结构 &#xff08;二&#xff09;计算过程 &#xff08;三&#xf…

IDEA编写SpringBoot项目时使用Lombok报错“找不到符号”的原因和解决

目录 概述|背景 报错解析 解决方法 IDEA配置解决 Pom配置插件解决 概述|背景 报错发生背景&#xff1a;在SpringBoot项目中引入Lombok依赖并使用后出现"找不到符号"的问题。 本文讨论在上述背景下发生的报错原因和解决办法&#xff0c;如果仅为了解决BUG不论原…

使用golang wails写了一个桌面端小工具:WoWEB, 管理本地多前端项目

WoWEB 本地快速启动 http 服务。 辅助管理本地前端项目。 使用界面配置代理转发。 支持平台 windows 10macOS 功能描述 管理本地前端项目启动本地 HTTP 服务&#xff0c;可本地或者局域网访问快速打开项目文件夹配置 HTTP 代理转发规则&#xff0c;方便开发调试 以下情况…

Unity Dots理论学习-5.与ECS相关的概念

DOTS的面向数据编程方式比你在MonoBehaviour项目中常见的面向对象编程方式更适合硬件开发。可以尝试理解一些与数据导向设计&#xff08;DOD&#xff09;相关的关键概念&#xff0c;以及这些概念如何影响你的代码&#xff0c;对你在MonoBehaviour项目中的C#编程通常是较少涉及的…

【hive】记一次hiveserver内存溢出排查,线程池未正确关闭导致

一、使用 MemoryAnalyzer软件打开hprof文件 很大有30G&#xff0c;win内存24GB&#xff0c;不用担心可以打开&#xff0c;ma软件能够生成索引文件&#xff0c;逐块分析内存&#xff0c;如下图。 大约需要4小时。 overview中开不到具体信息。 二、使用Leak Suspects功能继续…

(篇三)基于PyDracula搭建一个深度学习的软件之解析yolo算法融合

文章目录 1YoloPredictor类——检测器1.1继承BasePredictor解析1.2继承QObject解析 2MainWindow类——主窗口 在前面两篇中&#xff0c;篇一介绍了启动界面的制作&#xff0c;篇二介绍了如何修改PyDracula的界面&#xff0c;那么这一篇我们学习一下yolo要融合进入软件中&#x…

26~31.ppt

目录 26.北京主要的景点 题目 解析 27.创新产品展示及说明会 题目​ 解析 28.《小企业会计准则》 题目​ 解析 29.学习型社会的学习理念 题目​ 解析 30.小王-产品展示信息 题目​ 解析 31.小王-办公理念-信息工作者的每一天 题目​ 解析 26.北京主要的景点…

Vue.js 状态管理库Pinia

Pinia Pinia &#xff1a;Vue.js 状态管理库Pinia持久化插件-persist Pinia &#xff1a;Vue.js 状态管理库 Pinia 是 Vue 的专属状态管理库&#xff0c;它允许你跨组件或页面共享状态。 要使用Pinia &#xff0c;先要安装npm install pinia在main.js中导入Pinia 并使用 示例…

day10-字符串

目录 字符串1、API 和 API 帮助文档2、String概述3、String构造方法代码实现 和 内存分析3.1 创建String对象的两种方式3.2 Java的内存模型 4、字符串的比较4.1 号的作用4.2 equals方法的作用 练习5、用户登录6、遍历字符串和统计字符个数7、字符串拼接和翻转8、较难练习-金额转…

从二叉树遍历深入理解BFS和DFS

1. 介绍 1.1 基础 BFS&#xff08;Breadth-First Search&#xff0c;广度优先搜索&#xff09;和 DFS&#xff08;Depth-First Search&#xff0c;深度优先搜索&#xff09;是两种常见的图和树的遍历算法。 BFS&#xff1a;从根节点&#xff08;或起始节点&#xff09;开始&am…

【大数据安全分析】大数据安全分析技术框架与关键技术

在数字化时代&#xff0c;网络安全面临着前所未有的挑战。传统的网络安全防护模式呈现出烟囱式的特点&#xff0c;各个安全防护措施和数据相互孤立&#xff0c;形成了防护孤岛和数据孤岛&#xff0c;难以有效应对日益复杂多变的安全威胁。而大数据分析技术的出现&#xff0c;为…

亚博microros小车-原生ubuntu支持系列 27、手掌控制小车运动

背景知识 本节跟上一个测试类似&#xff1a;亚博microros小车-原生ubuntu支持系列&#xff1a;26手势控制小车基础运动-CSDN博客 都是基于MediaPipe hands做手掌、手指识别的。 为了方便理解&#xff0c;在贴一下手指关键点分布。手掌位置就是靠第9点来识别的。 2、程序说明…

MySQL第五次作业

根据图片内容完成作业 1.建表 &#xff08;1&#xff09;建立两个表:goods(商品表)、orders(订单表) mysql> create table goods( -> gid char(8) primary key, -> name varchar(10), -> price decimal(8,2), -> num int); mysql> create t…

Linux:软硬链接和动静态库

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《Linux&#xff1a;软硬链接和动静态库》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 如果本篇文章对你有帮助&#xff0c;还请各位点点赞&#xff0…

CSS 组合选择符详解与实战示例

在 Web 开发过程中&#xff0c;CSS 用于定义页面元素的样式&#xff0c;而选择器则帮助我们精确定位需要添加样式的元素。今天我们主要来讲解 CSS 中的组合选择符&#xff0c;它们能够根据 DOM 结构中元素之间的关系来选中目标元素&#xff0c;从而写出结构清晰、易于维护的 CS…