通過圖片流來返回圖片

来源: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
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...