Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Visual Studio中使用图形裁剪图像会更改文件类型标题_C#_Asp.net_Image Processing_Jpeg_Crop - Fatal编程技术网

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

C# 在Visual Studio中使用图形裁剪图像会更改文件类型标题,c#,asp.net,image-processing,jpeg,crop,C#,Asp.net,Image Processing,Jpeg,Crop,我正在尝试裁剪图像并将其保存到服务器。我遇到的问题是,我遵循的裁剪过程似乎对jpeg和jpg图像有副作用。 我尝试的处理方法与我在许多关于在asp.net中裁剪图像的帖子中发现的方法略有不同,因为我使用的是byte[]作为图像 public static byte[] CropImage(byte[] imgBytes, Rectangle rec) { MemoryStream ms = new MemoryStream(imgBytes); I

我正在尝试裁剪图像并将其保存到服务器。我遇到的问题是,我遵循的裁剪过程似乎对jpeg和jpg图像有副作用。 我尝试的处理方法与我在许多关于在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Ϋ „ ) 另一方面,当我用记事本打开一个.png图像时,我注意到它以

‰PNG

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

我可以想出两种方法:

  • 将字节[]另存为Jpeg图像,然后将新字节发送回用户
  • 创建一个空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;
        }
    

    那么,如果存储图像而不进行裁剪,会发生什么情况呢?它工作正常吗?如果我不使用裁剪过程,它工作正常是的。它不会丢失任何元数据,并且在Alfresco中可以正确预览图像。但是,为什么需要保留这些数据呢?无论如何,图像本身都会被裁剪,因此肯定会丢失数据。我知道数据会丢失。我在问是否有办法避免这种情况发生。例如,如果有一种裁剪图像的不同方式机制,并且不会丢失其标题。也许有某种方法可以裁剪特定的jpeg图像。但我的主要问题是,在户外,用户无法查看jpeg图像缩略图。我可以将它们另存为.png,因为裁剪过程似乎会对图像和缩略图进行正确显示,但我不确定这是否是最好的方式。感谢您的回答,它可以工作,但我想知道是否有一种方法可以以不影响.jpeg标题的方式更改裁剪图像。我猜,因为我为我的过程创建了一个位图,所以没有考虑格式,最终的结果是图像尽可能简单。不过,我希望您能解释一下这个过程的工作方式。我认为标准的.Net jpeg支持不够先进,无法导出所有原始的jpeg头数据。。。甚至可以从原始jpeg头中读取。