通過圖片流來返回圖片

来源:https://www.cnblogs.com/ZYPLJ/archive/2023/06/05/17457385.html
-Advertisement-
Play Games

# 通過圖片流來返回圖片 # 前言 之前寫了個圖片介面,然後做了個授權,但是光返回圖片地址雖然能適應大部分需求,但是考慮到有些人不想去處理返回值,也是做了個直接返回圖片流的介面。 # 介面展示 ## 返回指定寬度和高度圖片流 ![image](https://img2023.cnblogs.com/ ...


通過圖片流來返回圖片

前言

之前寫了個圖片介面,然後做了個授權,但是光返回圖片地址雖然能適應大部分需求,但是考慮到有些人不想去處理返回值,也是做了個直接返回圖片流的介面。

介面展示

返回指定寬度和高度圖片流

image

直接返回原圖

image

介面實現

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

代碼詳解如下:

  1. 首先調用 GetConfiguration 方法獲取當前 Image 對象的配置信息。
  2. 調用 ImageFormatsManager.FindEncoder 方法,根據指定的圖像格式獲取相應的編碼器。
  3. 創建一個 MemoryStream 對象,並使用 await 等待對象創建完成。
  4. 調用 image.SaveAsync 方法,將當前 Image 對象保存到記憶體流中,並使用指定的編碼器進行編碼。
  5. 創建一個 FileContentResult 對象,將記憶體流中的圖像數據作為文件內容,並將文件類型設置為 image/jpeg
  6. 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>

image

token和其他的請求方式在上一篇文章已經說過了,只需要通過公眾號獲取token即可訪問介面,關註公眾號回覆“獲取token”就行
ZY知識庫 · ZY - 圖片介面JWT鑒權實現 (pljzy.top)

image

聲明

本項目學習於StarBlog · 畫星星高手 - Home Page (deali.cn)中圖片介面而來,我的ZY知識庫也是基於該博客學習而來,這個博主嘎嘎流弊。博客是開源的,對於.NET感興趣的可以去瞭解一下。

然後這個圖片項目也是更新了3篇文章,如果後面沒什麼特別的需求是不會更新了,這個小項目也就到此結束。

我的博客地址:

ZY知識庫 · ZY - Home Page (pljzy.top)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 基於java的倉庫管理系統設計與實現,可適用於出庫、入庫、庫存管理,基於java的出入庫管理,java出入庫管理系統,基於java的WMS倉庫管理系統,庫存物品管理系統。 ...
  • # 1、背景 在我們開發的過程中有這麼一種場景, `/projectA` 目錄是 `hadoopdeploy`用戶創建的,他對這個目錄有`wrx`許可權,同時這個目錄屬於`supergroup`,在這個組中的用戶也具有這個目錄的`wrx`許可權,對於其他人,不可訪問這個目錄。現在有這麼一個特殊的用戶`r ...
  • 有時候,我們為了方便,我們往往使用擴展函數的代碼方式創建很多GridView的操作功能,如在隨筆《在DevExpress中使用BandedGridView表格實現多行表頭的處理》中介紹過多行表頭的創建及綁定處理,在《基於DevExpress的GridControl實現的一些界面處理功能》也介紹了一些... ...
  • ## 一:背景 ### 1. 講故事 在這麼多的案例分析中,往往會發現一些案例是卡死線上程的內核態棧上,但拿過來的dump都是用戶態模式下,所以無法看到內核態棧,這就比較麻煩,需要讓朋友通過其他方式生成一個藍屏的dump,這裡我們簡單彙總下。 ## 二:如何生成內核態dump ### 1. 案例代碼 ...
  • # 使用c#實現23種常見的設計模式 設計模式通常分為三個主要類別: - 創建型模式 - 結構型模式 - 行為型模式。 這些模式是用於解決常見的對象導向設計問題的最佳實踐。 以下是23種常見的設計模式並且提供`c#代碼案例`: ## 創建型模式: ### 1. 單例模式(Singleton) ``` ...
  • SM2是國家密碼管理局於2010年12月17日發佈的橢圓曲線公鑰密碼演算法。 產生背景: 隨著密碼技術和電腦技術的發展,目前常用的1024位RSA演算法面臨嚴重的安全威脅,我們國家密碼管理部門經過研究,決定採用SM2橢圓曲線演算法替換RSA演算法。 SM2演算法和RSA演算法都是公鑰密碼演算法,SM2演算法是一種 ...
  • 導航屬性 導航屬性是作為.NET ORM核心功能中的核心,在SqlSugar沒有支持導航屬性前,都說只是一個高級DbHelper, 經過3年的SqlSugar重構已經擁有了一套 非常成熟的導航屬性體系,本文不是重點講SqlSugar而是重點講導航屬性的作用,讓更多寫Sql人還未使用ORM的人瞭解到O ...
  • System.Speech是.NET框架的一部分,提供了語音識別和語音合成的功能。通過使用System.Speech命名空間中的類,開發人員可以在.NET應用程式中實現語音識別功能。 在本文中,我將演示如何使用 System.Speech.NET,這是開發語音應用程式比較牛逼的內庫。它適用於 .NE ...
一周排行
    -Advertisement-
    Play Games
  • 周末,寫點簡單的水一下。 新版本的vs創建項目的時候可以選擇自帶一個swagger。然而這隻是基本的swagger功能。 幾個介面無所謂啦,隨著介面越來越多,就這麼丟給你,一時間也會懵逼,所以這篇文章要做的有兩個功能。 給swagger文檔添加註釋 給swagger添加切換“版本”的功能(也可以理解 ...
  • 大家好,我是沙漠盡頭的狼。 本文首發於Dotnet9,介紹使用Lib.Harmony庫攔截第三方.NET庫方法,達到不修改其源碼並能實現修改方法邏輯、預期行為的效果,並且不限於只攔截public訪問修飾的類及方法,行文目錄: 什麼是方法攔截? 示常式序攔截 非public方法怎麼攔截? 總結 1. ...
  • 問題代碼: xmal:一個按鈕+一個顯示框 1 <Button Width="100" Height="50" Margin="10" Click="Button_Click">test</Button> 2 <TextBox x:Name="display" Width="300" Height= ...
  • 前置條件 ​ 阿裡雲伺服器一臺(可在購買伺服器時勾選安裝寶塔選項,免去後面的寶塔安裝) ​ 設置阿裡雲伺服器密碼並登陸伺服器 ​ 以下操作均在伺服器Linux中進行(使用遠程連接工具登錄) 寶塔登錄 登錄阿裡雲伺服器在Linux命令行中輸入bt,查看寶塔信息 ​ 根據寶塔信息提供的網站登陸寶塔服務( ...
  • GetTokenInformation 用於檢索進程或線程的令牌(Token)信息。Token是一個數據結構,其包含有關進程或線程的安全上下文,代表當前用戶或服務的安全標識符和許可權信息。GetTokenInformation函數也可以用來獲取這些安全信息,通常用於在運行時檢查某個進程或線程的許可權或安... ...
  • matplotlib 在1.0版本之前其實是不支持3D圖形繪製的。 後來的版本中,matplotlib加入了3D圖形的支持,不僅僅是為了使數據的展示更加生動和有趣。更重要的是,由於多了一個維度,擴展了其展示數據分佈和關係的能力,可以一次從三個維度來比較數據。 下麵介紹在matplotlib中繪製各類 ...
  • 編寫一個App就能編譯發佈到iOS、Android和Web等各大平臺的跨平臺技術,各大廠商一直都有研究和發佈對應技術產品,目前最熱門的莫過於Flutter框架了。而Dart作為其唯一的編程語言,今天我們開始來體驗一下…… ...
  • 實現基本的線程池 前提:我們要實現的線程池有如下功能: 基本的線程池模型 能提交和運行任務 能正常關閉線程池 線程的拒絕策略 線程池擴容 縮容線程池 代碼地址: 1、線程池的介紹? 線程池是什麼? 線程池是一種利用池化技術來管理線程的一種技術。 當沒有線程池的時候,我們如何創建線程? 繼承Threa ...
  • SDRAM基本信息 儲存能力計算 4X16X4=256(Mbit),註意不是MByte SDRAM控制 sdram包含兩個部分:sdram_ctrl、fifo_ctrl。 sdram_ctrl:其頂層為SDRAM的控制模塊內部實例化了5個模塊,有初始化、自刷新、寫和讀模塊,還有一個仲裁模塊對這四個不 ...
  • 歡迎訪問我的GitHub 這裡分類和彙總了欣宸的全部原創(含配套源碼):https://github.com/zq2599/blog_demos 本篇概覽 欣宸正在為接下新的Java雲原生實戰系列原創做準備,既然是實戰,少不了一套雲原生環境,以下內容是必不可少的: linux操作系統 kuberne ...