Nizar Belhiba Ответов: 1

Asp.net основное изображение на холсте


Привет, мне нужно создать шаблон изображения, в котором пользователь определяет и помечает/выделяет/ некоторые регионы. цель состоит в том, чтобы в следующий раз, когда пользователь загрузит аналогичное изображение, программа распознала его и автоматически выделила области, которые были определены в шаблоне.

это должно быть сделано как веб-приложение, поэтому я использую ASP.net сердечник

Я думал загрузить изображение, сохранить его на холсте, а затем нарисовать с помощью мыши прямоугольник на областях, и сохранить как-то каждый раз, когда указатель мыши/прямоугольник координата в холсте и размер.

Загрузка файла и последующее отображение изображения (не на холсте) работает отлично.

Но я понятия не имею, почему изображение не загружается в холст.

Что я уже пробовал:

мое представление Index.cshtml:
<script src="~/js/jquery-2.2.3.min.js"></script>
<form method="post" asp-controller="Home" asp-action="ImageUpload" enctype="multipart/form-data">
    <div class="from-group row">
        <label class="col-sm-2 col-form-label">Scan Datei </label>
        <div class="col-sm-10">
            <div class="custom-file">
                <input class="from-control custom-file-input" type="file" name="file" onchange="LoadImagetoCanvas()" />
                <label class="custom-file-label">Datei auswählen</label>
            </div>
        </div>
        <button type="submit">Bild laden</button>
    </div>
    <img calss="custom-image" src="@ViewData["FileLocation"]" width="600" height="400" />
    <canvas id="imageCanvas" height="740" width="1024" runat="server" style="border:2px solid black">
            Your browser is not supporting HTML5 Canvas .Upgrade Browser to view this program or check with Chrome or in Firefox.
        </canvas>

</form>
<script>
        $(function () {
            $(".custom-file-input").change(function (e) {
                var file = e.target.files[0],
                    imageType = /image.*/;

                if (!file.type.match(imageType))
                    return;

                var reader = new FileReader();
                reader.onload = fileOnload;
                reader.readAsDataURL(file);
            });

            function fileOnload(e) {
                var $img = $('<img>', { src: e.target.result });
                $img.load(function () {
                    var canvas = $('#imageCanvas')[0];
                    var context = canvas.getContext('2d');

                    canvas.width = this.naturalWidth;
                    canvas.height = this.naturalHeight;
                    context.drawImage(this, 0, 0);
                });
            }
        });
</script>


часть c#
public class HomeController : Controller
    {
        IHostingEnvironment _env;

        public HomeController(IHostingEnvironment environment)
        {
            _env = environment;
        }

        public IActionResult Index()
        {
            return View();
        }

        public IActionResult Privacy()
        {
            return View();
        }

        [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
        public IActionResult Error()
        {
            return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
        }

        [HttpPost]
        public async Task<IActionResult> ImageUpload(IFormFile file)
        {
            if(file != null && file.Length>0)
            {
                string imagePath = @"\Upload\Images\";
                string uploadPath = _env.WebRootPath + imagePath;

                if(!Directory.Exists(uploadPath))
                {
                    Directory.CreateDirectory(uploadPath);
                }

                string uniqFileName = Guid.NewGuid().ToString();
                string filename = Path.GetFileName(uniqFileName+"."+file.FileName.Split(".")[1].ToLower());
                string fullPath = uploadPath + filename;
                Image image;                

                string filePath = @".." + Path.Combine(imagePath, filename);
                
                using (FileStream fileStream = new FileStream(fullPath, FileMode.Create))
                {
                    await file.CopyToAsync(fileStream);                    
                }

                ViewData["FileLocation"] = filePath;
            }

            return View("../Home/Index");
        }
    }



Я даже попытался добавить функцию Javascript и вызвать ее из части c#, но безуспешно, так как даже если функция будет вызвана, кажется, что он не может найти мой холст:

<script "text/javascript">
        function LoadImagetoCanvas() {
            var c = document.getElementById("imageCanvas")
            var ctx = c.getContext("2d")
            var imageObj = new Image()
            imageObj.src = "./Uploads/Auto.jpg"
            imageObj.onload = () => {
                ctx.drawImage(imageObj, 0, 0)
            }
            alert("Test")
        }
    </script>


ScriptManager.RegisterStartupScript(this, GetType(), "LoadImagetoCanvas", "LoadImagetoCanvas()", true);

1 Ответов

Рейтинг:
1

Nizar Belhiba

Я нашел решение, моя проблема в том, что
1-й я должен был сослаться на jQuery, добавив

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.js"></script>

2-й мой проект был настроен на использование HTTPS,и мне пришлось вернуть его на нормальный HTTP


Richard Deeming

Плохая идея. Если вы развернете свой сайт без использования HTTPS, он будет восприимчив к перехвату и вмешательству.
Трой Хант: вот почему ваш статический сайт нуждается в HTTPS[^]

Google CDN поддерживает HTTPS. Вместо этого обратитесь к сценарию, используя URL-адрес HTTPS:

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.js"></script>

Затем вы можете оставить свой сайт настроенным на HTTPS.

Nizar Belhiba

Спасибо :D