C# 在Visual Studio中使用图形裁剪图像会更改文件类型标题
我正在尝试裁剪图像并将其保存到服务器。我遇到的问题是,我遵循的裁剪过程似乎对jpeg和jpg图像有副作用。 我尝试的处理方法与我在许多关于在asp.net中裁剪图像的帖子中发现的方法略有不同,因为我使用的是byte[]作为图像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
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文件,或者我在这里遗漏了其他内容?我可以想出两种方法:
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头中读取。