Я использую WinForms. В моей форме у меня есть pictureBox
(установлен на normal mode
), следующую и предыдущую кнопку. Я хочу быстро изменить размер и загрузить многостраничные изображения TIF. Когда я перехожу на следующую страницу в многостраничном TIF-изображении, я испытываю задержку каждый раз, когда изображение рисуется на pictureBox
. Средняя скорость изображения составляет около 800 миллисекунд. Я хочу, чтобы страницы загружались в течение 100 миллисекунд.
Я хочу, чтобы производительность обработки больших изображений TIF выполнялась так же быстро, как IrfanView. IrfanView - небольшое приложение для просмотра изображений. Если вы загружаете IrfanView, вы можете видеть, насколько быстро это работает. В настоящее время у меня есть другое решение, в котором я использую многопоточную работу фона для загрузки страниц TIF в массив, а затем я масштабирую его. Этот метод требует некоторого времени изначально, но цель здесь не должна ждать.
Есть ли способ улучшить производительность Graphics.DrawImage
для больших изображений в .NET?
g.DrawImage(img, 0, 0, ширина, высота);//Эта строка вызывает задержку "800 миллисекунд в зависимости от вашего компьютера"
- Размер изображений TIF, с которыми я работаю: Width = 16800, Height = 10800
- Только черно-белые изображения Tif
- Глубина бит = 1
- Единица разрешения = 2
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Tif_Preformance_Question
{
public partial class Form1 : Form
{
int counter = -1;
int frameCount = 0;
Stopwatch s = new Stopwatch();
Image img;
Image[] images;
public Form1()
{
InitializeComponent();
}
private void btn_Open_Click(object sender, EventArgs e)
{
var s = new Stopwatch();
s.Start();
s.Stop();
this.Text = "Elapsed Time Milliseconds" + s.ElapsedMilliseconds;
img = Image.FromFile(@"C:\image\Large_Tif_Image_15pages.tif");
frameCount = img.GetFrameCount(System.Drawing.Imaging.FrameDimension.Page);
images = new Image[frameCount];
for (int i = 0; i < frameCount; i++)
{
img.SelectActiveFrame(System.Drawing.Imaging.FrameDimension.Page, i);
images[i] = (Image)img.Clone();
}
img.SelectActiveFrame(System.Drawing.Imaging.FrameDimension.Page, 0);
pictureBox1.Image = (Image)img.Clone();
}
private void btn_Next_Click(object sender, EventArgs e)
{
counter++;
if (counter >= frameCount)
{
counter = frameCount - 1;
btn_Next.Enabled = false;
}
btn_Next.Enabled = false;
LoadPage();
btn_Next.Enabled = true;
}
private void LoadPage()
{
StartWatch();
img.SelectActiveFrame(System.Drawing.Imaging.FrameDimension.Page, counter);
pictureBox1.Image = ResizeImage((Image)img.Clone(), pictureBox1.Width, pictureBox1.Height);
pictureBox1.Refresh();
Stopwatch();
}
public Image ResizeImage(Image img, int width, int height)
{
Bitmap b = new Bitmap(width, height);
using (Graphics g = Graphics.FromImage((Image)b))
{
g.DrawImage(img, 0, 0, width, height);
}
return (Image)b;
}
private void StartWatch()
{
s.Start();
}
private void Stopwatch()
{
s.Stop();
this.Text = "Elapsed Time Milliseconds: " + s.ElapsedMilliseconds;
s.Reset();
}
}
}
Ссылки
IrfanView:
Тест: изображение с большим TIF ниже
http://www.filedropper.com/largetifimage15pages_2
Решение Visual Studio