SixLabors.ImageSharp 如何讀取 IDAT 校驗失敗的 png 圖片

lindexi發表於2024-11-21

以下是我的讀取程式碼

using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Formats;
using SixLabors.ImageSharp.Formats.Png;
using SixLabors.ImageSharp.Processing;

var file = @"C:\lindexi\Image\Image.png";
using var image = Image.Load(file);

執行將會看到如下異常

SixLabors.ImageSharp.InvalidImageContentException:“CRC Error. PNG IDAT chunk is corrupt!”

這是因為我傳入的是一張損壞的圖片

解決方法就是透過 PngDecoder 解碼器,傳入 PngCrcChunkHandling.IgnoreAll 列舉,讓其忽略即可。修改之後程式碼如下

using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Formats;
using SixLabors.ImageSharp.Formats.Png;
using SixLabors.ImageSharp.Processing;

var file = @"C:\lindexi\Image\Image.png";

using var fileStream = File.OpenRead(file);

var decode = PngDecoder.Instance.Decode(new PngDecoderOptions()
{
    PngCrcChunkHandling = PngCrcChunkHandling.IgnoreAll,
}, fileStream);

解碼之後即可獲取圖片的資訊,如獲取格式和尺寸

var decodeSize = decode.Size;
var pixelType = decode.PixelType;

SixLabors.ImageSharp 庫開源地址: https://github.com/SixLabors/ImageSharp

以下是安裝了 SixLabors.ImageSharp 庫的 csproj 專案檔案的程式碼

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net9.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="SixLabors.ImageSharp" Version="3.1.6" />
  </ItemGroup>

</Project>

本文程式碼放在 githubgitee 上,可以使用如下命令列拉取程式碼。我整個程式碼倉庫比較龐大,使用以下命令列可以進行部分拉取,拉取速度比較快

先建立一個空資料夾,接著使用命令列 cd 命令進入此空資料夾,在命令列裡面輸入以下程式碼,即可獲取到本文的程式碼

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 63c9ca8f563ad8e5d4b26bc1a740b10af243abce

以上使用的是國內的 gitee 的源,如果 gitee 不能訪問,請替換為 github 的源。請在命令列繼續輸入以下程式碼,將 gitee 源換成 github 源進行拉取程式碼。如果依然拉取不到程式碼,可以發郵件向我要程式碼

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin 63c9ca8f563ad8e5d4b26bc1a740b10af243abce

獲取程式碼之後,進入 Workbench/HegerkalailayiwuCulalajer 資料夾,即可獲取到原始碼

更多技術部落格,請參閱 部落格導航

相關文章