在 Visual Studio 中裁剪带有图形的图像会更改文件类型 headers

Cropping Image with Graphics in Visual Studio changes file type headers

我正在尝试裁剪图像并将其保存到服务器。我遇到的问题是,我遵循的裁剪过程似乎对 jpeg 和 jpg 图像有一个 side-effect。 我正在尝试的 process-method 与我在许多关于在 asp.net 中裁剪图像的帖子中发现的略有不同,因为我使用的是 byte[] 作为图像。

    public static byte[] CropImage(byte[] imgBytes, Rectangle rec)
    {
        MemoryStream ms = new MemoryStream(imgBytes);
        Image img = Image.FromStream(ms);

        Bitmap croppedBmpImage = new Bitmap(200, 200);

        using (Graphics gr = Graphics.FromImage(croppedBmpImage))
        {
            gr.SmoothingMode = SmoothingMode.HighQuality;
            gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
            gr.PixelOffsetMode = PixelOffsetMode.HighQuality;
            gr.DrawImage(img, new Rectangle(0, 0, 200, 200),
                rec,
                GraphicsUnit.Pixel);
        }

        ImageConverter converter = new ImageConverter();
        byte[] result = (byte[]) converter.ConvertTo(croppedBmpImage, typeof(byte[]));
        croppedBmpImage.Dispose();

        return result;
    }

图像已正确裁剪,在我的计算机中没有任何预览问题。但是,我正在使用 Alfresco 存储图像,我发现应用程序内的缩略图预览不适用于图像。据我所知,这只发生在 .jpg 和 .jpeg 图像上。根据我的阅读,.jpg 和 .jpeg 图像在其中存储了一些元数据,这些元数据似乎已从我裁剪后的图像中删除。 当我用记事本打开原始 .jpg 或 .jpeg 图像时,我注意到它以一些元数据细节之王(例如 JFIF)开头。 (Ψð JFIF H H Ϋ „ ) 另一方面,当我用记事本打开 .png 图像时,我注意到它以

开头
‰PNG

我的裁剪图像也是在裁剪过程后开始的。有什么方法可以保留原始元数据或从一开始就将图像裁剪为 .jpg 文件,还是我在这里遗漏了其他内容?

我可以想到两个办法:

  1. 将字节[]保存为Jpeg图像,然后将新字节发送回用户。
  2. 创建一个空的 Jpeg,然后附加裁剪后的字节。

第一个选项你可以看一个例子:

    public static byte[] CropImage(byte[] imgBytes, Rectangle rec)
    {
        byte[] result = null;
        using (MemoryStream mStream = new MemoryStream(imgBytes))
        {
            Image img = Image.FromStream(mStream);

            Bitmap croppedBmpImage = new Bitmap(200, 200);
            using (Graphics graphics = Graphics.FromImage(croppedBmpImage))
            {
                graphics.SmoothingMode = SmoothingMode.HighQuality;
                graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
                graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
                graphics.DrawImage(img, new Rectangle(0, 0, 200, 200),
                    rec,
                    GraphicsUnit.Pixel);
            }

            ImageConverter converter = new ImageConverter();
            result = (byte[])converter.ConvertTo(croppedBmpImage, typeof(byte[]));

            using (MemoryStream jpegStream = new MemoryStream(result))
            {
                croppedBmpImage.Save(jpegStream, System.Drawing.Imaging.ImageFormat.Jpeg);
                Image img1 = Image.FromStream(jpegStream);
                img1.Save(@"C:\Users\darellis\Desktop\image1.jpg");
            }

            croppedBmpImage.Dispose();
        }

        return result;
    }