0

たぶんメモリストリームでどうにか?

private void satellitesToolStripMenuItem_Click(object sender, EventArgs e)
{
    file_array_satellite = Directory.GetFiles(UrlsPath, "RainImage*.*");
    for (int i = 0; i < file_array_satellite.Length; i++)
    {
        Image s = new Bitmap(file_array_satellite[i]);
        s = resizeImage(s, new Size(100, 100));
        s.Save(UrlsPath + "Changed" + i.ToString("D6") + ".jpg");
    }
    file_array_satellite = Directory.GetFiles(UrlsPath, "Changed*.*");
    if (file_array_satellite.Length > 0)
    {
        DateTime[] creationTimes8 = new DateTime[file_array_satellite.Length];
        for (int i = 0; i < file_array_satellite.Length; i++)
            creationTimes8[i] = new FileInfo(file_array_satellite[i]).CreationTime;
        Array.Sort(creationTimes8, file_array_satellite);
        file_indxs_satellite = 0;
        file_indxs_satellite = file_array_satellite.Length - 1;
        timer1.Enabled = true;
    }
}

public static Image resizeImage(Image imgToResize, Size size)
{
    return (Image)(new Bitmap(imgToResize, size));
}

private void pictureBox1_MouseEnter(object sender, EventArgs e)
{
    file_array_satellite = Directory.GetFiles(UrlsPath, "RainImage*.*");
    for (int i = 0; i < file_array_satellite.Length; i++)
    {
        Image s = new Bitmap(file_array_satellite[i]);
        s = resizeImage(s, new Size(500, 500));
    }
    this.pictureBox1.Size = new Size(500, 500);
    pictureBox1.Location = new Point(this.Bounds.Width / 3,
                        this.Bounds.Height / 3);
    this.pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
    pictureBox1.BringToFront();
}

この場合、画像を表示しているpictureBoxのサイズは100,100なので、画像のサイズを100,100に変更してpictureBoxに表示します。次に、pictureBox 領域にマウスを移動すると、pictureBox がフォームの中央に移動し、pictureBox のサイズを 500,500 に変更し、画像のサイズを再び 500,500 に変更して、pictureBox に表示します。

問題は、ハードディスク上の画像サイズの変更/変換に、毎回ほぼ 3 ~ 5 秒かかることです。

サイズ変換を行うより速い方法はありますか?

編集**

現在の表示画像のみのサイズを変更しようとしているコードを変更しましたが、pictureBox1 の画像は現在同じサイズではなく、pictureBox にアニメーションが表示されません。

private void timer1_Tick(object sender, EventArgs e)
        {
            try
            {


                Image s = new Bitmap(file_array_satellite[file_indxs_satellite]);
                s = resizeImage(s, new Size(100, 100));
                pictureBox1.Load(file_array_satellite[file_indxs_satellite]);
                file_indxs_satellite = file_indxs_satellite - 1;
                if (file_indxs_satellite < 0)
                {
                    file_indxs_satellite = file_array_satellite.Length - 1;
                }
            }
            catch
            {
                timer1.Enabled = false;
            }
        }

        private void satellitesToolStripMenuItem_Click(object sender, EventArgs e)
        {
            file_array_satellite = Directory.GetFiles(UrlsPath, "RainImage*.*");
            if (file_array_satellite.Length > 0)
            {
                DateTime[] creationTimes8 = new DateTime[file_array_satellite.Length];
                for (int i = 0; i < file_array_satellite.Length; i++)
                    creationTimes8[i] = new FileInfo(file_array_satellite[i]).CreationTime;
                Array.Sort(creationTimes8, file_array_satellite);
                file_indxs_satellite = 0;
                file_indxs_satellite = file_array_satellite.Length - 1;
                timer1.Enabled = true;
            }
        }

        public static Image resizeImage(Image imgToResize, Size size)
        {
            return (Image)(new Bitmap(imgToResize, size));
        }
4

1 に答える 1

3

実装にいくつかの問題があります。まずこれらを修正してください。

  • 500x500 から 100x100 にサイズ変更してから 500x500 に戻すと、画像の品質が低下します。
  • あなたはあなたのイメージを処分していません。
  • 画像を 1 つだけ表示したいのに、なぜすべての画像を読み込んでサイズを変更するのですか? ホバーした画像のサイズを変更するだけで、ディスクに保存する必要さえありません。

大量の画像を表示したい場合の一般的なヒント:

  • GUI で実際に表示する画像のみをロードし、スクロールを開始したらさらにロードします。
  • それでも遅い場合は、バックグラウンド スレッドで読み込み、完了したら画像ごとに表示します。
于 2013-10-08T16:07:08.803 に答える