使用C#中的Imagick将.HEIC格式转换为JPEG

15

我在将HEIC文件转换为JPEG方面遇到了麻烦。

我已经尝试在网上搜索,我可以找到如何写入文件夹,但找不到如何获得一个已转换文件的byte[],以便我可以保存它。

       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);

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

4个回答

12

其他解决方案。

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

using ImageMagick;

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");
    }
}

你是在暗示,例如被接受的答案在.NET 6或Magick.NET-Q16上不起作用吗? - Jeremy Caney
2
不是,但这是我在.NET6中找到的最简单的路径。 - Sios

7
根据文档,就像@SLaks建议的那样,您需要通过MemoryStream来处理。请查看此示例,直接从文档中获取: 转换图像格式
// 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();
}

0

这对我而言可行,使用的是dotnet 6Nuget Package Magick.NET-Q16-AnyCPU

using (MagickImage image = new MagickImage(filePath))
{
    image.Format = MagickFormat.Jpeg;
    // Save frame as jpg
    image.Write(filePath2);
}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接