Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 60 additions & 0 deletions OpenAIChatGPTBlazor/Components/EditImageOptions.razor
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
@using OpenAI.Images
@using Microsoft.AspNetCore.Components.Forms

<EditForm Model="@this">
<div class="form-group">
<div class="row g-2 align-items-center">
<div class="col-auto">
<label for="size" class="col-form-label">Size</label>
</div>
<div class="col-auto">
<InputSelect @bind-Value="_size" class="form-select form-select-sm" style="min-width: 120px;">
<option value="1024x1024">1024x1024</option>
<option value="1024x1536">1024x1536</option>
<option value="1536x1024">1536x1024</option>
</InputSelect>
</div>
<div class="col-auto">
<label for="quality" class="col-form-label">Quality</label>
</div>
<div class="col-auto">
<InputSelect id="quality" name="quality" @bind-Value="_quality" class="form-select form-select-sm" style="min-width: 90px;">
<option value="high">High</option>
<option value="medium">Medium</option>
<option value="low">Low</option>
</InputSelect>
</div>
<div class="col-auto">
<label for="inputFidelity" class="col-form-label">Input Fidelity</label>
</div>
<div class="col-auto">
<InputSelect id="inputFidelity" @bind-Value="_inputFidelity" class="form-select form-select-sm" style="min-width: 100px;">
<option value="standard">Standard</option>
<option value="high">High</option>
</InputSelect>
</div>
</div>
</div>
</EditForm>

@code {
private string _size = "1024x1024";
private string _quality = "high";
private string _inputFidelity = "standard";

public GeneratedImageSize GetImageSize()
{
var parts = _size.Split("x");
return new GeneratedImageSize(int.Parse(parts[0]), int.Parse(parts[1]));
}

public GeneratedImageQuality GetImageQuality()
{
return new GeneratedImageQuality(_quality);
}

public string GetInputFidelity()
{
return _inputFidelity;
}
}
5 changes: 5 additions & 0 deletions OpenAIChatGPTBlazor/Components/Layout/NavMenu.razor
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,11 @@
<i class="bi fas fa-image" aria-hidden="true"></i> Image Gen
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="EditImage" Match="NavLinkMatch.All">
<i class="bi fas fa-edit" aria-hidden="true"></i> Image Edit
</NavLink>
</div>
</nav>
</div>

93 changes: 93 additions & 0 deletions OpenAIChatGPTBlazor/Components/Pages/EditImage.razor
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
@page "/EditImage"
@rendermode InteractiveServer
@using System.Globalization
@using Microsoft.Extensions.Options;
@using Microsoft.FeatureManagement;
@using Microsoft.AspNetCore.Components.Web
@using Microsoft.AspNetCore.Components.Forms
@inject IConfiguration Configuration
@inject IJSRuntime JS
@inject IFeatureManager FeatureManager
@inject IOptionsMonitor<OpenAIOptions> OpenAIOptions

<PageTitle>Image Editor</PageTitle>

<article>
<div class="top-row p-4 header justify-content-between">
<h4>
Image Editor using OpenAI
</h4>
</div>
<div class="row main align-content-start p-4 img-container">

@if (_loading)
{
<br />
<div class="loader"></div>
<p>... please wait ...</p>
}
@if (_warningMessage.Length > 0)
{
<div class="alert alert-warning">
<strong>Warning!</strong> @_warningMessage.
</div>
}

@if (_originalImageDataUrl != null)
{
<div class="row mb-3">
<div class="col-12">
<h6>Original Image:</h6>
<img src="@_originalImageDataUrl" class="img-fluid" style="max-width:400px; max-height:300px; border:1px solid #ccc; border-radius:8px;" />
</div>
</div>
}

@if (_editedImageDataUrl != null)
{
<div class="row mb-3">
<div class="col-12">
<h6>Edited Image:</h6>
<img src="@_editedImageDataUrl" class="img-fluid" style="max-width:400px; max-height:300px; border:1px solid #ccc; border-radius:8px;" />
<div class="mt-2">
<button class="btn btn-primary btn-sm" @onclick="DownloadEditedImage">
<i class="fas fa-download"></i> Download
</button>
</div>
</div>
</div>
}
</div>
<hr />
<div class="row footer">
<div class="col-sm-8">
<div class="mb-3">
<label class="btn btn-outline-primary" style="cursor:pointer;">
<i class="fas fa-upload"></i> Upload Image to Edit
<InputFile OnChange="OnFileSelected" accept="image/*" style="display:none" />
</label>
@if (_uploadedFile != null)
{
<span class="ms-2 text-success">
<i class="fas fa-check"></i> @_uploadedFile.Name uploaded
</span>
}
</div>
<textarea type="text" class="form-control" id="promptArea" placeholder="Enter your editing instructions (e.g., 'Add a sunset in the background', 'Change the color to blue', 'Remove the person from the image')"
@bind="_prompt" @bind:event="oninput" @onkeydown="OnPromptKeydown">
</textarea>
</div>
<br />
<div class="col-sm-2">
<button id="editBtn" class="btn btn-success" @onclick="OnEditClick" type="submit" disabled="@(_loading || _uploadedFile == null || string.IsNullOrWhiteSpace(_prompt))">
<i class="fas fa-edit"></i> Edit Image
</button>
<button class="btn btn-danger" @onclick="OnAbortClick" type="submit" disabled="@(!_loading)">
<i class="fas fa-stop"></i> Abort
</button>
</div>
<div class="col-12 mb-2">
<OpenAIChatGPTBlazor.Components.EditImageOptions @ref="_optionsComponent" />
</div>
</div>
</article>
Loading