ASP.NET Core Blazor에서 이미지 작업
참고 항목
이 문서의 최신 버전은 아닙니다. 현재 릴리스는 이 문서의 .NET 8 버전을 참조 하세요.
Important
이 정보는 상업적으로 출시되기 전에 실질적으로 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적, 또는 묵시적인 보증을 하지 않습니다.
현재 릴리스는 이 문서의 .NET 8 버전을 참조 하세요.
이 문서에서는 Blazor 앱에서 이미지 작업을 수행하는 일반적인 시나리오에 대해 설명합니다.
동적으로 이미지 소스 설정
다음 예제에서는 C# 필드를 사용하여 이미지의 소스를 동적으로 설정하는 방법을 보여 줍니다.
이 섹션의 예제에는 다음이 적용됩니다.
원본에서 세 개의 이미지를 가져오거나 다음 각 이미지를 마우스 오른쪽 단추로 클릭하여 로컬로 저장합니다. 이미지의 이름을
image1.png
,image2.png
및image3.png
로 지정합니다.앱의 웹 루트(
wwwroot
)의images
(이)라는 이름의 새 폴더에 이미지를 배치합니다.images
폴더는 시연 목적으로만 사용합니다.wwwroot
폴더에서 직접 이미지를 제공하는 것을 포함하여 원하는 폴더 레이아웃으로 이미지를 구성할 수 있습니다.
다음은 ShowImage1
구성 요소에 대한 설명입니다.
- 이미지의 소스(
src
)는 C#에서imageSource
값으로 동적으로 설정됩니다. ShowImage
메서드는 메서드에 전달된 이미지id
인수를 기준으로imageSource
필드를 업데이트합니다.- 렌더링된 단추는
images
폴더의 사용 가능한 세 이미지 각각에 대해 이미지 인수를 사용하여ShowImage
메서드를 호출합니다. 파일 이름은 메서드에 전달된 인수를 사용하여 구성되며images
폴더의 세 이미지 중 하나와 일치합니다.
ShowImage1.razor
:
@page "/show-image-1"
<PageTitle>Show Image 1</PageTitle>
<h1>Show Image Example 1</h1>
@if (imageSource is not null)
{
<p>
<img src="@imageSource" />
</p>
}
@for (var i = 1; i <= 3; i++)
{
var imageId = i;
<button @onclick="() => ShowImage(imageId)">
Image @imageId
</button>
}
@code {
private string? imageSource;
private void ShowImage(int id)
{
imageSource = $"images/image{id}.png";
}
}
@page "/show-image-1"
<h1>Dynamic Image Source Example</h1>
@if (imageSource is not null)
{
<p>
<img src="@imageSource" />
</p>
}
@for (var i = 1; i <= 3; i++)
{
var imageId = i;
<button @onclick="() => ShowImage(imageId)">
Image @imageId
</button>
}
@code {
private string? imageSource;
private void ShowImage(int id)
{
imageSource = $"images/image{id}.png";
}
}
@page "/show-image-1"
<h1>Dynamic Image Source Example</h1>
@if (imageSource is not null)
{
<p>
<img src="@imageSource" />
</p>
}
@for (var i = 1; i <= 3; i++)
{
var imageId = i;
<button @onclick="() => ShowImage(imageId)">
Image @imageId
</button>
}
@code {
private string? imageSource;
private void ShowImage(int id)
{
imageSource = $"images/image{id}.png";
}
}
앞의 예제에서는 C# 필드를 사용하여 이미지의 소스 데이터를 저장하지만 C# 속성을 사용하여 데이터를 저장할 수도 있습니다.
참고 항목
위 for
루프 예제의 i
와 같이 람다 식에서 직접 루프 변수를 사용하지 않습니다. 직접 사용하는 경우 모든 람다 식에서 동일한 변수가 사용되어 모든 람다에서 동일한 값이 사용됩니다. 로컬 변수에서 변수의 값을 캡처합니다. 앞의 예에서:
- 루프 변수
i
는imageId
에 할당됩니다. imageId
는 람다 식에서 사용됩니다.
또는 위의 문제가 발생하지 않는 Enumerable.Range를 가진 foreach
루프를 사용합니다.
@foreach (var imageId in Enumerable.Range(1,3))
{
<button @onclick="() => ShowImage(imageId)">
Image @imageId
</button>
}
자세한 내용은 ASP.NET Core Blazor 이벤트 처리를 참조하세요.
이미지 데이터 스트리밍
공용 URL에서 이미지를 호스팅하는 대신 Blazor의 스트리밍 interop 기능을 사용하여 이미지를 클라이언트로 직접 보낼 수 있습니다.
이 섹션의 예제에서는 JS(JavaScript) interop을 사용하여 이미지 원본 데이터를 스트리밍합니다. 다음 setImage
JS 함수는 이미지에 대한 <img>
태그 id
및 데이터 스트림을 허용합니다. 이 함수는 다음 단계를 수행합니다.
- 제공된 스트림을
ArrayBuffer
로 읽어옵니다. Blob
을 만들어ArrayBuffer
를 래핑합니다.- 표시할 이미지의 주소로 사용할 개체 URL을 만듭니다.
- 지정된
imageElementId
가 있는<img>
요소를 새로 만든 개체 URL로 업데이트합니다. - 메모리 누수를 방지하려면 구성 요소가 이미지 작업을 완료할 때 함수가
revokeObjectURL
을(를) 호출하여 개체 URL을 삭제합니다.
<script>
window.setImage = async (imageElementId, imageStream) => {
const arrayBuffer = await imageStream.arrayBuffer();
const blob = new Blob([arrayBuffer]);
const url = URL.createObjectURL(blob);
const image = document.getElementById(imageElementId);
image.onload = () => {
URL.revokeObjectURL(url);
}
image.src = url;
}
</script>
참고 항목
위치 및 프로덕션 앱에 JS 대한 권장 사항에 대한 일반적인 지침은 ASP.NET Core Blazor 앱의 JavaScript 위치를 참조하세요.
다음 ShowImage2
구성 요소는
- System.Net.Http.HttpClient 및 Microsoft.JSInterop.IJSRuntime에 대한 서비스를 삽입합니다.
- 이미지를 표시하는
<img>
태그를 포함시킵니다. - 이미지에 대한 Stream을(를) 검색할
GetImageStreamAsync
C# 메서드가 있습니다. 프로덕션 앱은 특정 사용자에 따라 이미지를 동적으로 생성하거나 스토리지에서 이미지를 검색할 수 있습니다. 다음 예제에서는dotnet
GitHub 리포지토리에 대한 .NET 아바타를 검색합니다. - 사용자가 단추를 선택할 때 트리거되는
SetImageAsync
메서드가 있습니다.SetImageAsync
에서는 다음 단계를 수행합니다.GetImageStreamAsync
에서 Stream을 검색합니다.- DotNetStreamReference에 Stream을 래핑하면 이미지 데이터를 클라이언트에 스트리밍할 수 있습니다.
- 클라이언트에서 데이터를 허용하는
setImage
JavaScript 함수를 호출합니다.
참고 항목
서버 쪽 앱은 전용 HttpClient 서비스를 사용하여 요청을 수행하므로 서비스 등록 HttpClient 을 위해 서버 쪽 Blazor 앱의 개발자는 아무런 조치도 필요하지 않습니다. 클라이언트 쪽 앱은 프로젝트 템플릿에서 앱을 만들 때 기본 HttpClient 서비스 등록을 갖 Blazor 습니다. HttpClient 클라이언트 쪽 앱의 파일에 서비스 등록이 Program
없는 경우 다음을 추가하여 builder.Services.AddHttpClient();
제공합니다. 자세한 내용은 ASP.NET Core에서 IHttpClientFactory를 사용하여 HTTP 요청 만들기를 참조하세요.
ShowImage2.razor
:
@page "/show-image-2"
@inject HttpClient Http
@inject IJSRuntime JS
<PageTitle>Show Image 2</PageTitle>
<h1>Show Image Example 2</h1>
<p>
<img id="image" />
</p>
<button @onclick="SetImageAsync">
Set Image
</button>
@code {
private async Task<Stream> GetImageStreamAsync()
{
return await Http.GetStreamAsync(
"https://avatars.githubusercontent.com/u/9141961");
}
private async Task SetImageAsync()
{
var imageStream = await GetImageStreamAsync();
var dotnetImageStream = new DotNetStreamReference(imageStream);
await JS.InvokeVoidAsync("setImage", "image", dotnetImageStream);
}
}
@page "/show-image-2"
@inject HttpClient Http
@inject IJSRuntime JS
<h1>Stream Image Data Example</h1>
<p>
<img id="image" />
</p>
<button @onclick="SetImageAsync">
Set Image
</button>
@code {
private async Task<Stream> GetImageStreamAsync()
{
return await Http.GetStreamAsync(
"https://avatars.githubusercontent.com/u/9141961");
}
private async Task SetImageAsync()
{
var imageStream = await GetImageStreamAsync();
var dotnetImageStream = new DotNetStreamReference(imageStream);
await JS.InvokeVoidAsync("setImage", "image", dotnetImageStream);
}
}
@page "/show-image-2"
@inject HttpClient Http
@inject IJSRuntime JS
<h1>Stream Image Data Example</h1>
<p>
<img id="image" />
</p>
<button @onclick="SetImageAsync">
Set Image
</button>
@code {
private async Task<Stream> GetImageStreamAsync()
{
return await Http.GetStreamAsync(
"https://avatars.githubusercontent.com/u/9141961");
}
private async Task SetImageAsync()
{
var imageStream = await GetImageStreamAsync();
var dotnetImageStream = new DotNetStreamReference(imageStream);
await JS.InvokeVoidAsync("setImage", "image", dotnetImageStream);
}
}
추가 리소스
ASP.NET Core
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기