Uso WinForms. All'interno del mio modulo ho un pictureBox
(impostato su normal mode
), pulsante successivo e precedente. Voglio ridimensionare e caricare rapidamente le immagini TIF multipagina. Quando si passa alla pagina successiva nell'immagine TIF multipagina, si verifica un ritardo ogni volta che l'immagine viene disegnata su pictureBox
. La velocità media dell'immagine è di circa 800 millisecondi. Desidero caricare le pagine entro 100 Millisecondi.Visualizzazione di immagini Tif di più pagine in 100 millisecondi
Desidero le prestazioni di elaborando immagini TIF di grandi dimensioni veloci come IrfanView. IrfanView è una piccola applicazione per la visualizzazione di immagini. Se scarichi IrfanView puoi vedere quanto è veloce la performance. Attualmente ho un'altra soluzione in cui utilizzo l'operatore in background multi-threading per caricare le pagine TIF in un array, quindi lo ridimensiono. Questo metodo richiede inizialmente un po 'di tempo, ma l'obiettivo qui non è dover aspettare.
C'è un modo per migliorare le prestazioni di Graphics.DrawImage
per le immagini di grandi dimensioni in .NET?
g.DrawImage (img, 0, 0, larghezza, altezza); // Questa riga causa il ritardo "800 millisecondi a seconda del computer"
- La dimensione delle immagini TIF con cui lavoro: Width = 16800, altezza = 10800 immagini
- Solo bianco e nero Tif
- profondità di bit = 1
- Unità Risoluzione = 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();
}
}
}
Riferimenti
IrfanView:
prova: Grande immagine TIF seguito
http://www.filedropper.com/largetifimage15pages_2
Visual Studio Solution
http://www.filedropper.com/tifpreformancequestion_1
Forse è possibile memorizzare nella cache le immagini precedenti, attuali e successive ogni volta che si verifica la navigazione? – Crowcoder
Utilizzare un backgroundworker per creare un elenco di immagini ridimensionate che puoi memorizzare nella cache è la mia prossima ipotesi .. – TaW
Grazie per la risposta, ho una soluzione simile a quella che hai menzionato. Questa è la soluzione alternativa che uso: http://stackoverflow.com/questions/35510498/boost-the-performance-when-advancing-to-the-next-page-using-tif-images. Questa soluzione utilizza un worker in background che carica le pagine TIF e le ridimensiona. Questa soluzione è veloce solo quando tutte le pagine sono caricate, ma ci vuole ancora tempo. Stavo pensando di visualizzare le pagine non appena l'immagine viene caricata nella casella immagine. Inoltre, non voglio aspettare molto tempo prima che l'immagine TIF venga caricata nella pictureBox. @TaW – taji01