代码之家  ›  专栏  ›  技术社区  ›  Anastasios Selmani

在Visual Studio中使用图形裁剪图像会更改文件类型标题

  •  2
  • Anastasios Selmani  · 技术社区  · 8 年前

    我正在尝试裁剪图像并将其保存到服务器。我遇到的问题是,我遵循的裁剪过程似乎对jpeg和jpg图像有副作用。 我正在尝试的处理方法与我在许多关于在asp中裁剪图像的帖子中发现的方法略有不同。net,因为我使用字节[]作为图像。

        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图像在其中存储一些元数据,这些元数据似乎是从我裁剪的图像中删除的。 另一方面,当我用记事本a打开时。png图片我注意到它以

    ‰PNG
    

    在裁剪过程之后,我的裁剪图像也是这样开始的。有没有办法保留原始元数据或将图像裁剪为一个。jpg文件从一开始,还是我在这里遗漏了什么?

    1 回复  |  直到 8 年前
        1
  •  3
  •   ddarellis    8 年前

    我可以想出两种方法:

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