# 通過圖片流來返回圖片 # 前言 之前寫了個圖片介面,然後做了個授權,但是光返回圖片地址雖然能適應大部分需求,但是考慮到有些人不想去處理返回值,也是做了個直接返回圖片流的介面。 # 介面展示 ## 返回指定寬度和高度圖片流 ![image](https://img2023.cnblogs.com/ ...
通過圖片流來返回圖片
前言
之前寫了個圖片介面,然後做了個授權,但是光返回圖片地址雖然能適應大部分需求,但是考慮到有些人不想去處理返回值,也是做了個直接返回圖片流的介面。
介面展示
返回指定寬度和高度圖片流
直接返回原圖
介面實現
Service層
如何返回圖片流給前端呢,首先寫個Service層,創建GetOriginalDrawingAsync
方法:
imagePath
為圖片存儲的路徑,代碼太多了,這裡就不做多的解釋了,至於圖片路徑怎麼傳都行,只要是能訪問到的路徑就行。
public async Task<(Image, IImageFormat)> GetOriginalDrawingAsync(string imagePath)
{
await using var fileStream = new FileStream(imagePath, FileMode.Open);
var (image, format) = await Image.LoadWithFormatAsync(fileStream);
return (image, format);
}
上述方法使用了SixLabors.ImageSharp
庫,可通過NuGet包下載
首先這個方法的返回值是(Image, IImageFormat)
Image
表示一個圖像對象,包含了圖像的像素數據和相關的元數據信息。IImageFormat
表示圖像的格式,例如 JPEG、PNG 等。這兩個對象一起組成了這個方法的返回值,表示從指定路徑的圖像文件中讀取到的原始圖像及其格式。
Controller層
然後在控制器層編寫一個私有方法去處理Service返回的圖片信息
private static async Task<IActionResult> GenerateImageResponse(Image image, IImageFormat format)
{
var encoder = image.GetConfiguration().ImageFormatsManager.FindEncoder(format);
await using var stream = new MemoryStream();
await image.SaveAsync(stream, encoder);
return new FileContentResult(stream.GetBuffer(), "image/jpeg");
}
代碼詳解如下:
- 首先調用
GetConfiguration
方法獲取當前Image
對象的配置信息。 - 調用
ImageFormatsManager.FindEncoder
方法,根據指定的圖像格式獲取相應的編碼器。 - 創建一個
MemoryStream
對象,並使用await
等待對象創建完成。 - 調用
image.SaveAsync
方法,將當前Image
對象保存到記憶體流中,並使用指定的編碼器進行編碼。 - 創建一個
FileContentResult
對象,將記憶體流中的圖像數據作為文件內容,並將文件類型設置為image/jpeg
。 - 將
FileContentResult
對象作為IActionResult
對象返回給調用方。
編寫介面
[HttpGet]
public async Task<IActionResult> GetImageStreamOd()
{
var (image, format) = await _getImageService.GetOriginalDrawingFormatAsync();
return await GenerateImageResponse(image, format);
}
Ok,一個返回圖片流的介面就完成了。
說明
這樣子請求就很方便了,不過介面使用了授權,需要在請求的時候帶上token欄位,如何繼續採用之前的方法帶上token還是要進行處理,不過我在後臺設置了一下,只要Get請求參數中有token即可。
返回指定格式圖片:
http://zy.pljzy.top/Api/Image/GetImageStream?token=這裡填寫token&width=500&height=500
返回原圖:
http://zy.pljzy.top/Api/Image/GetImageStreamOd?token=這裡填寫token
然後直接就能在網站上使用了
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title></title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<img src="http://zy.pljzy.top/Api/Image/GetImageStreamOd?token=這裡是token" alt=""/>
</body>
</html>
token和其他的請求方式在上一篇文章已經說過了,只需要通過公眾號獲取token即可訪問介面,關註公眾號回覆“獲取token”就行
ZY知識庫 · ZY - 圖片介面JWT鑒權實現 (pljzy.top)
聲明
本項目學習於StarBlog · 畫星星高手 - Home Page (deali.cn)中圖片介面而來,我的ZY知識庫也是基於該博客學習而來,這個博主嘎嘎流弊。博客是開源的,對於.NET感興趣的可以去瞭解一下。
然後這個圖片項目也是更新了3篇文章,如果後面沒什麼特別的需求是不會更新了,這個小項目也就到此結束。
我的博客地址:
ZY知識庫 · ZY - Home Page (pljzy.top)