Asp.net core 图像快速旋转会切断图像的一部分
我正在尝试使用ImageSharp旋转图像 这是我的.NET核心API代码:Asp.net core 图像快速旋转会切断图像的一部分,asp.net-core,imagesharp,Asp.net Core,Imagesharp,我正在尝试使用ImageSharp旋转图像 这是我的.NET核心API代码: public async Task<IActionResult> Rotate([FromBody] PhotoRotateViewModel model) { var photo = await _photoRepository.Get(model.PhotoId); if (photo != null) { byt
public async Task<IActionResult> Rotate([FromBody] PhotoRotateViewModel model)
{
var photo = await _photoRepository.Get(model.PhotoId);
if (photo != null)
{
byte[] imageBytes;
HttpWebRequest imageRequest = (HttpWebRequest)WebRequest.Create(photo.imageUrl);
WebResponse imageResponse = imageRequest.GetResponse();
Stream responseStream = imageResponse.GetResponseStream();
using (BinaryReader br = new BinaryReader(responseStream))
{
imageBytes = br.ReadBytes(500000);
br.Close();
}
responseStream.Close();
imageResponse.Close();
var rotatedImage = RotateImage(imageBytes);
}
return Ok();
}
private byte[] RotateImage(byte[] imageInBytes)
{
using (var image = Image.Load(imageInBytes, out var imageFormat))
{
image.Mutate(x => x.Rotate(90));
return ImageToByteArray(image, imageFormat);
}
}
private byte[] ImageToByteArray(Image<Rgba32> image, IImageFormat imageFormat)
{
using (var ms = new MemoryStream())
{
image.Save(ms, imageFormat);
return ms.ToArray();
}
}
公共异步任务旋转([FromBody]PhotoRotateView模型)
{
var photo=wait_photopository.Get(model.PhotoId);
如果(照片!=null)
{
字节[]图像字节;
HttpWebRequest imageRequest=(HttpWebRequest)WebRequest.Create(photo.imageUrl);
WebResponse imageResponse=imageRequest.GetResponse();
Stream responseStream=imageResponse.GetResponseStream();
使用(BinaryReader br=新的BinaryReader(responseStream))
{
imageBytes=br.ReadBytes(500000);
br.Close();
}
responseStream.Close();
imageResponse.Close();
var RotateImage=RotateImage(图像字节);
}
返回Ok();
}
专用字节[]旋转图像(字节[]图像字节)
{
使用(var image=image.Load(imageInBytes,out var imageFormat))
{
变异(x=>x.Rotate(90));
返回ImageToByteArray(图像,imageFormat);
}
}
专用字节[]ImageToByteArray(图像图像,IImageFormat图像格式)
{
使用(var ms=new MemoryStream())
{
image.Save(ms,imageFormat);
返回ToArray女士();
}
}
看起来新图像被切断了
我已经附上了我的原始图像,以及我得到的结果
原件:
轮换:
这似乎发生在我尝试过的所有图像上我看过api文档。对于ImageSharp,在库或代码(旋转图像的部分)中似乎都没有问题。但我觉得有趣的是,当你读取字节时,你为要读取的字节设置了一个数字。而不是像这样阅读
imageBytes=br.ReadBytes(500000)代码>,尝试读取字节,直到流结束。要做到这一点,请尝试下面的代码
using (BinaryReader br = new BinaryReader(responseStream))
{
imageBytes = br.ReadBytes(int.MaxValue);
br.Close();
}
编辑:
处理内存不足异常,并借助或简单地设置br.ReadBytes(stream.Length)读取文件代码>我已经看过api文档了。对于ImageSharp,在库或代码(旋转图像的部分)中似乎都没有问题。但我觉得有趣的是,当你读取字节时,你为要读取的字节设置了一个数字。而不是像这样阅读imageBytes=br.ReadBytes(500000)代码>,尝试读取字节,直到流结束。要做到这一点,请尝试下面的代码
using (BinaryReader br = new BinaryReader(responseStream))
{
imageBytes = br.ReadBytes(int.MaxValue);
br.Close();
}
编辑:
处理内存不足异常,并借助或简单地设置br.ReadBytes(stream.Length)读取文件代码>谢谢你,你给我指明了正确的方向。我把50万换成了500万,结果成功了。当我尝试int.MaxValue时,我得到了一个内存不足的错误,一点问题也没有。是的,这是一个可能的错误,你可以检查这个答案来正确读取所有字节。谢谢你,你为我指明了正确的方向。我把50万换成了500万,结果成功了。当我尝试int.MaxValue时,我得到了一个内存不足的错误,一点问题也没有。是的,这是一个可能的错误,你可以检查这个答案来正确读取所有字节。