在 C# 中使用 imagick 将 .HEIC 转换为 JPEG

Posted

技术标签:

【中文标题】在 C# 中使用 imagick 将 .HEIC 转换为 JPEG【英文标题】:Converting .HEIC to JPEG using imagick in C# 【发布时间】:2019-11-18 05:17:42 【问题描述】:

我在将 heic 文件转换为 jpeg 时遇到问题

我已经尝试在网上搜索它,我可以找到如何写入文件夹但不知道如何获取转换文件的字节 [] 以便我可以保存它

       byte[] file = null;
        file = Convert.FromBase64String(dto.File);

        //Convert HEIC/HEIF to JPF
        if (extension == "HEIC" || extension == "HEIF")
        
          try
          
           using (MagickImageCollection images = new MagickImageCollection())
            
              images.Read(file);
              using (IMagickImage vertical = images.AppendVertically())
              
                var imgname = filename + ".jpeg";
                vertical.Format = MagickFormat.Jpeg;
                vertical.Density = new Density(300);
                vertical.Write(imgname);
                extension = "jpeg";
            
            
          
          catch (Exception ex)
          
            Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
          
        
            documentId = Service.AddSupportingDocument(file, extension , userName);

我无法获取输出文件,它只是一个字符串

【问题讨论】:

你为什么把它标记为 ASP.NET? @mason 对不起,这是一个错误。这是我关于 *** 的第一个问题。 标记您的问题时,请考虑该标记是否真的适用。在这种情况下,ASP.NET 与该问题无关。同样的错误也会发生在控制台应用程序中,对吧?所以也许只使用 .NET 标签是合适的。 @mason 好的我一定会记得的。 【参考方案1】:

根据文档,就像@SLaks 建议的那样,您需要通过 MemoryStream 来完成。直接从文档中查看example:

// Read first frame of gif image
using (MagickImage image = new MagickImage("Snakeware.gif"))

    // Save frame as jpg
    image.Write("Snakeware.jpg");


// Write to stream
MagickReadSettings settings = new MagickReadSettings();
// Tells the xc: reader the image to create should be 800x600
settings.Width = 800;
settings.Height = 600;

using (MemoryStream memStream = new MemoryStream())

    // Create image that is completely purple and 800x600
    using (MagickImage image = new MagickImage("xc:purple", settings))
    
        // Sets the output format to png
        image.Format = MagickFormat.Png;
        // Write the image to the memorystream
        image.Write(memStream);
    


// Read image from file
using (MagickImage image = new MagickImage("Snakeware.png"))

    // Sets the output format to jpeg
    image.Format = MagickFormat.Jpeg;
    // Create byte array that contains a jpeg file
    byte[] data = image.ToByteArray();

【讨论】:

【参考方案2】:

您需要创建一个MemoryStream,调用.Write() 将图像写入内存流,然后在流上调用.ToArray() 以获取它写入的字节。

【讨论】:

【参考方案3】:

其他解决方案。

适用于 dotnet 6Nuget 包 Magick.NET-Q16-AnyCPU

    string[] allfiles = Directory.GetFiles(@"__PATH__", "*.heic", SearchOption.AllDirectories);

foreach (var file in allfiles)

    FileInfo info = new FileInfo(file);
    using (MagickImage image = new MagickImage(info.FullName))
    
        // Save frame as jpg
        image.Write(@$"__OUTPATH__info.Name.jpg");
    



【讨论】:

您是否暗示,例如,接受的答案 not 适用于 .NET 6 或 Magick.NET-Q16? 不,但这是我找到的最简单的路径。 NET6​​.

以上是关于在 C# 中使用 imagick 将 .HEIC 转换为 JPEG的主要内容,如果未能解决你的问题,请参考以下文章

如何使用heic图片转换精灵,将heic转成JPG

HEIC格式是什么?怎么将HEIC图片转换JPG?

HEIC格式是什么?怎么将HEIC图片转换JPG?

HEIC文件怎么打开,一键批量将HEIC图片转换JPG/PNG/BMP

HEIC文件怎么打开,一键批量将HEIC图片转换JPG/PNG/BMP

电脑可以打开heic格式的文件吗,怎么转换heic