You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#的Windows Forms应用中读取.img文件并提取图片

解决Windows Forms中提取.img文件内图片的问题

Hey there! Let's figure out how to extract images from .img files in your Windows Forms app—since .img isn't a standard image format like JPG/PNG, that's why your basic file stream approach isn't working. Let's break this down step by step.

先搞清楚你的.img文件是什么类型

First off, .img is a generic extension that can mean a few different things:

  • A 磁盘/分区镜像(比如磁盘或SD卡的完整备份,里面包含多个文件,包括图片)
  • A 自定义图像容器(由特定软件创建,用来存储单张或多张原始图像数据)
  • A 重命名的原始图像文件(只有像素数据没有文件头,把.raw改成了.img)

要缩小范围的话,你可以用十六进制编辑器查看文件的前8-16字节。标准图像格式都有独特的签名(比如JPG以FF D8开头,PNG以89 50 4E 47开头),但.img会有不一样的内容——这个线索能帮我们找到正确的解决方向。

针对不同类型的解决方案

1. 如果是磁盘/分区镜像文件

如果你的.img是磁盘或分区备份,你需要先挂载镜像,然后浏览里面的内容找到图片。.NET生态里有个很棒的库叫DiscUtils,它支持大多数常见的磁盘镜像格式(比如ISO、VHD和原始.img分区)。

先安装DiscUtils的NuGet包(比如DiscUtils.Core和DiscUtils.Ntfs,如果是NTFS分区的话),然后试试这段代码:

using DiscUtils;
using DiscUtils.Ntfs;
using System.IO;
using System.Drawing;

// 加载.img镜像文件
using (var stream = File.OpenRead(FilePath.Text))
using (var disk = new DiskImageFile(stream))
{
    // 获取第一个分区(根据你的镜像实际情况调整)
    var volumeManager = new VolumeManager(disk);
    var volume = volumeManager.GetVolumes().First(v => v is NtfsFileSystem);
    
    // 挂载分区
    using (var ntfs = (NtfsFileSystem)volume.Open())
    {
        // 遍历分区内的文件,筛选图片格式
        foreach (var file in ntfs.GetFiles("/", "*.*", SearchOption.AllDirectories))
        {
            var ext = Path.GetExtension(file).ToLower();
            if (ext == ".jpg" || ext == ".png")
            {
                // 读取文件内容并转为Image对象
                using (var fileStream = ntfs.OpenFile(file, FileMode.Open))
                {
                    var image = Image.FromStream(fileStream);
                    // 在这里处理图像(比如显示、保存到本地等)
                }
            }
        }
    }
}

2. 如果是自定义格式的图像容器

如果.img是自定义容器(比如来自特定相机、扫描仪或软件),你需要找到该格式的结构文档。这类文件一般会有一个头部区域,包含图像的宽、高、像素格式、原始像素数据的偏移量等元数据,后面跟着实际的像素字节。

拿到这些信息后,你可以先解析头部,再提取像素数据并转换成Bitmap。示例代码如下:

using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

using (var fs = new FileStream(FilePath.Text, FileMode.Open, FileAccess.Read))
using (var reader = new BinaryReader(fs))
{
    // 假设你已经了解格式:先读取宽、高、像素格式
    int width = reader.ReadInt32();
    int height = reader.ReadInt32();
    // 比如24位RGB,每个像素占3字节
    PixelFormat format = PixelFormat.Format24bppRgb;

    // 跳到像素数据的起始位置(根据格式文档调整偏移量)
    fs.Seek(0x100, SeekOrigin.Begin);

    // 创建Bitmap并写入像素数据
    var bitmap = new Bitmap(width, height, format);
    var bitmapData = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, format);
    
    // 将读取到的像素字节写入Bitmap
    reader.Read(bitmapData.Scan0, 0, bitmapData.Stride * height);
    
    bitmap.UnlockBits(bitmapData);
    // 现在你可以使用这个bitmap对象了
}

3. 如果是重命名的原始图像文件

如果.img只是一个没有文件头的原始像素文件(把.raw改成了.img),你需要知道图像的精确尺寸和像素格式(可以从生成这个文件的源头获取)。然后用类似自定义容器的方法——跳过头部解析(因为没有头部),直接把字节映射到Bitmap即可。

为什么你的原始代码不工作

你原来的代码把.img文件当作普通文件流打开,但它不是标准图像格式,所以Image.FromStream()(我猜你接下来会尝试这个方法)无法识别它的结构。标准图像有头部信息告诉系统如何解码像素数据,而.img要么没有头部,要么有非标准的头部,所以你需要手动解析或者用能理解它结构的库来处理。

内容的提问来源于stack exchange,提问作者Billy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:07:46