Как загрузить изображение с сети, показывающей прогресс загрузки в c# с помощью winforms?

Используйте свойство - FittedBox - fit: для настройки ведущего виджета.

leading: FittedBox(
         fit: BoxFit.cover,
          child: FlatButton(
            materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, // add this to remove padding.
            onPressed: () {},
            child: Text(
              "Back",
//          textDirection: TextDirection.ltr,
              style: TextStyle(
                color: Colors.white,
                fontFamily: "Raleway-Medium",
                fontSize: 14.0,
              ),
            ),
          ),
        ),
8
задан Cerebrus 27 April 2009 в 07:49
поделиться

7 ответов

JPEG имеет специальный режим кодирования, называемый «Прогрессивный JPEG», в котором данные сжимаются в несколько проходов с постепенно увеличивающейся детализацией. Windows 7 имеет встроенную поддержку .

5
ответ дан 5 December 2019 в 08:00
поделиться

Я не думаю, что вы справитесь с этим, используя встроенные методы .NET Framework, так как они сначала прочитают полное изображение, а затем отобразят его. Вам нужно будет либо найти какую-нибудь другую библиотеку, которая поддерживает отображение частично загруженных изображений, либо написать собственный анализатор.

2
ответ дан 5 December 2019 в 08:00
поделиться

Когда вы начнете запрос, проверьте свойство WebResponse.ContentLength , которое должно дать вам общее количество байтов, которое следует ожидать. Затем следите за общим количеством прочитанных байтов в вашем методе ReadCallback. В остальном должно быть очевидно. :)

[edit] Упс, я перечитал вопрос, и это было не совсем то, что вы хотели. Я все еще оставляю это на всякий случай, на случай, если кто-то может извлечь из этого пользу.

3
ответ дан 5 December 2019 в 08:00
поделиться

Я хотел бы показать прогресс загрузка, как это делают браузеры, и не показывать только по окончании.

У вас есть два варианта:

  1. Использовать WebClient.DownloadDataAsync . Это вызовет события прогресса через DownloadProgressChanged и предоставит окончательное уведомление о том, когда данные станут доступны через событие DownloadDataCompleted . В этот момент вы можете назначить изображение, скажем, PictureBox .

  2. Если вы загружаете изображение, чтобы в конечном итоге отобразить его в элементе управления PictureBox , тогда это может быть даже проще. просто пойти с PictureBox.LoadAsync . Это также обеспечит обновления прогресса посредством его события LoadProgressChanged и, наконец, LoadCompleted по завершении.

4
ответ дан 5 December 2019 в 08:00
поделиться

У вас проблема с элементом управления PictureBox, а не с частичной загрузкой.

Хакерство заключается в использовании WebBrowserControl, поскольку IE может показывать частичные изображения.

4
ответ дан 5 December 2019 в 08:00
поделиться

Возможно, вы сможете это сделать, однако для этого потребуются некоторые дополнительные знания о структуре файлов gif. Wotsit.org имеет несколько ссылок на документы структуры gif, чтобы вы могли начать.

Общий подход будет заключаться в том, чтобы взять ваши общие накопленные данные и с конца искать назад, пока не найдете конец терминатор блока. Данные между этим последним допустимым блоком и концом потока завершены только частично и должны считаться ненужными. Вы хотите удалить его и добавить в поток завершающий блок файла. Затем вы сможете загрузить этот отредактированный поток в PictureBox.

2
ответ дан 5 December 2019 в 08:00
поделиться

Есть событие, которое вы можете использовать в асинхронном веб-запросе загрузки, который периодически вызывается и позволяет вам напрямую обновлять элемент управления ProgressBar. Вот пример того, как я использовал это событие:

    delegate void SetProgressDelegate(int percentComplete);
    /// <summary>
    /// A thread-safe method for updating the file download progress bar.
    /// </summary>
    /// <param name="bytesReceived"></param>
    /// <param name="totalBytes"></param>
    void SetDownloadProgress(int percentComplete)
    {
        if (this.InvokeRequired)
        {
            SetProgressDelegate d = new SetProgressDelegate(SetDownloadProgress);
            this.Invoke(d, new object[] { percentComplete });
        }
        else
        {
            this.progressFileDownload.Value = percentComplete;
        }
    }
    /// <summary>
    /// Event handler to update the progress bar during file download.
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    void web_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
    {
        SetDownloadProgress(e.ProgressPercentage);
    }

А вот как я подключаю событие и начинаю загрузку:

            WebClient web = new WebClient();
            web.DownloadFileCompleted += new AsyncCompletedEventHandler(web_DownloadFileCompleted);
            web.DownloadProgressChanged += new DownloadProgressChangedEventHandler(web_DownloadProgressChanged);
            web.DownloadFileAsync(sourceUri, destinationFileName);

Ваше решение считывает файл прямо в память, а мое сохраняет его в файл на диске, поэтому это решение может работать или не работать для вас. Если для вас важно отображение индикатора выполнения, этот метод работает, и вы всегда можете загрузить его во временный файл, а затем загрузить этот файл в элемент управления изображением после его завершения.

1
ответ дан 5 December 2019 в 08:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: