содержание
Пакетное преобразование изображений.
Поворачивайте и переворачивайте изображения
Отображает овальное изображение.
Пакетное преобразование изображений.
Пакетное преобразование изображений в основном использует класс Thread и класс ImageFormat. Используйте класс Thread, чтобы открыть новый поток для выполнения пакетного преобразования изображений, чтобы программа не достигла приостановки анимации.
namespace PictureBatchConversion
{
public partial class Frm_Main : Form
{
public Frm_Main()
{
InitializeComponent();
}
string[] path1=null; // используется для хранения выбранного списка файлов
string path2=""; //путь для хранения и сохранения
Bitmap bt; // Объявляем объект Bitmap, который преобразует формат изображения
Thread td; // объявляем поток
int Imgtype1; //объявляем переменную для обозначения типа, преобразованного в методе ConvertImage
string OlePath; // Объявляем переменную для хранения пути исходного изображения в методе ConvertImage
string path; //объявляем переменную для хранения пути сохранения сконвертированного изображения в методе ConvertImage
int flags; // используется для обозначения количества конвертированных изображений, используемых для расчета прогресса конвертации
private void Form2_Load(object sender, EventArgs e)
{
tscbType.SelectedIndex = 0;//Устанавливаем первый выбранный тип преобразования
CheckForIllegalCrossThreadCalls = false;//блокируем всплывающее сообщение об ошибке потока
}
private void toolStripButton3_Click(object sender, EventArgs e)//Выберите кнопку для преобразования файла
{
If (openFileDialog1.ShowDialog() == DialogResult.OK) //Определяем, нужно ли выбирать файл
{
listView1.Items.Clear();//Очистить listView1
string[] info = new string[7]; // Сохраняем каждую строку данных
FileInfo fi; //Создаем объект FileInfo для получения информации об изображении
path1 = openFileDialog1.FileNames;//Получить выбранную коллекцию изображений
for (int i = 0; i
{
//Получить имя изображения
string ImgName = path1[i].Substring(path1[i].LastIndexOf("\") + 1, path1[i].Length - path1[i].LastIndexOf("\") - 1);
//Получить тип изображения
string ImgType = ImgName.Substring(ImgName.LastIndexOf(".") + 1, ImgName.Length - ImgName.LastIndexOf(".") - 1);
fi = new FileInfo(path1[i].ToString());//Создаем экземпляр объекта FileInfo
// Добавляем значок в первую позицию каждой строки данных в imageList1
imageList1.Images.Add(ImgName,Properties.Resources.icon__23_);
info[1] = ImgName;//имя изображения
info[2] = ImgType;//тип изображения
info[3] = fi.LastWriteTime.ToShortDateString();//дата последней модификации картинки
info[4] = path1[i].ToString();//расположение изображения
info[5] = (fi.Length/1024)+"KB";//размер изображения
info[6] = "не преобразовано";//статус изображения
ListViewItem lvi = new ListViewItem(info, ImgName); //Создаем экземпляр объекта ListViewItem
listView1.Items.Add(lvi);//Добавляем информацию в элемент управления listView1
}
tsslFileNum.Text = "текущее количество" + path1.Length.ToString() + "files";//количество картинок, отображаемых в строке состояния
}
}
private void toolStripButton2_Click (отправитель объекта, EventArgs e) // кнопка закрытия
{
Application.Exit();//Выходим из системы
}
private void toolStripButton5_Click(object sender, EventArgs e) //Кнопка для очистки списка
{
listView1.Items.Clear();//Очищаем список
path1 = null; //очистить коллекцию картинок
tsslFileNum.Text = "В данный момент файла нет";//Подсказка в строке состояния
tsslPlan.Text = "";//Очистить номер прогресса
}
private void toolStripButton1_Click(object sender, EventArgs e)
{
If (path1 == null) // Определяем, нужно ли выбирать картинку
{
MessageBox.Show("Выберите изображение!", "Подсказка", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
If (path2.Length == 0) // Решаем, выбирать ли место для сохранения
{
MessageBox.Show("Выберите место для сохранения!", "Подсказка", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
Flags = 1; //Инициализируем переменную flags значением 1 для подсчета прогресса
toolStrip1.Enabled = false;//Когда начинается переход, отключаем панель инструментов
int flag = tscbType.SelectedIndex;//Определяем, в какой формат конвертировать изображение
switch (флаг) //конвертировать в соответствии с разными форматами
{
case 0:
Imgtype1 = 0; //Если выбран первый элемент, конвертируем в формат BMP
td = new Thread(new ThreadStart(ConvertImage)); //Вызов метода ConvertImage через поток для преобразования
td.Start();
break;
Случай 1: //Если выбран второй элемент, конвертировать в формат JPG
Imgtype1 = 1;
td = new Thread(new ThreadStart(ConvertImage));//Вызываем метод ConvertImage через поток для преобразования
td.Start();
break;
Случай 2: //Если выбран третий элемент, конвертировать в формат PNG
Imgtype1 = 2;
td = new Thread(new ThreadStart(ConvertImage));//Вызываем метод ConvertImage через поток для преобразования
td.Start();
break;
Случай 3: //Если выбран четвертый элемент, конвертировать в формат GIF
Imgtype1 = 3;
td = new Thread(new ThreadStart(ConvertImage));//Вызываем метод ConvertImage через поток для преобразования
td.Start();
break;
default: td.Abort(); break;
}
}
}
}
private void toolStripButton4_Click(object sender, EventArgs e)//Выберите кнопку сохранения пути
{
If (folderBrowserDialog1.ShowDialog() == DialogResult.OK) //Определяем, следует ли выбирать путь сохранения
{
Path2 = folderBrowserDialog1.SelectedPath;//Получить путь сохранения
}
}
private void ConvertImage()
{
flags = 1;
switch (Imgtype1)
{
case 0:
for (int i = 0; i < path1.Length; i++)
{
string ImgName = path1[i].Substring(path1[i].LastIndexOf("\") + 1, path1[i].Length - path1[i].LastIndexOf("\") - 1);
ImgName = ImgName.Remove(ImgName.LastIndexOf("."));
OlePath = path1[i].ToString();
bt = new Bitmap(OlePath);
path = path2 + "\" + ImgName + ".bmp";
bt.Save(path, System.Drawing.Imaging.ImageFormat.Bmp);
listView1.Items[flags - 1].SubItems[6].Text = "Преобразовано";
tsslPlan.Text = "Преобразование"+флаги*100/path1.Length+"%";
if (flags == path1.Length)
{
toolStrip1.Enabled = true;
tsslPlan.Text = "Преобразование изображения завершено";
}
flags++;
}
break;
case 1:
for (int i = 0; i < path1.Length; i++)
{
string ImgName = path1[i].Substring(path1[i].LastIndexOf("\") + 1, path1[i].Length - path1[i].LastIndexOf("\") - 1);
ImgName = ImgName.Remove(ImgName.LastIndexOf("."));
OlePath = path1[i].ToString();
bt = new Bitmap(OlePath);
path = path2 + "\" + ImgName + ".jpeg";
bt.Save(path, System.Drawing.Imaging.ImageFormat.Jpeg);
listView1.Items[flags - 1].SubItems[6].Text = "Преобразовано";
tsslPlan.Text = "Преобразование" + flags * 100 / path1.Length + "%";
if (flags == path1.Length)
{
toolStrip1.Enabled = true;
tsslPlan.Text = "Преобразование изображения завершено";
}
flags++;
}
break;
case 2:
for (int i = 0; i < path1.Length; i++)
{
string ImgName = path1[i].Substring(path1[i].LastIndexOf("\") + 1, path1[i].Length - path1[i].LastIndexOf("\") - 1);
ImgName = ImgName.Remove(ImgName.LastIndexOf("."));
OlePath = path1[i].ToString();
bt = new Bitmap(OlePath);
path = path2 + "\" + ImgName + ".png";
bt.Save(path, System.Drawing.Imaging.ImageFormat.Png);
listView1.Items[flags - 1].SubItems[6].Text = "Преобразовано";
tsslPlan.Text = "Преобразование" + flags * 100 / path1.Length + "%";
if (flags == path1.Length)
{
toolStrip1.Enabled = true;
tsslPlan.Text = "Преобразование изображения завершено";
}
flags++;
}
break;
case 3:
for (int i = 0; i < path1.Length; i++)
{
string ImgName = path1[i].Substring(path1[i].LastIndexOf("\") + 1, path1[i].Length - path1[i].LastIndexOf("\") - 1);
ImgName = ImgName.Remove(ImgName.LastIndexOf("."));
OlePath = path1[i].ToString();
bt = new Bitmap(OlePath);
path = path2 + "\" + ImgName + ".gif";
bt.Save(path, System.Drawing.Imaging.ImageFormat.Gif);
listView1.Items[flags - 1].SubItems[6].Text = "Преобразовано";
tsslPlan.Text = "Преобразование" + flags * 100 / path1.Length + "%";
if (flags == path1.Length)
{
toolStrip1.Enabled = true;
tsslPlan.Text = "Преобразование изображения завершено";
}
flags++;
}
break;
default: bt.Dispose(); break;
}
}
private void Form2_FormClosed(object sender, FormClosedEventArgs e)//Закрывать поток при закрытии окна
{
if (td != null) //Определяем, есть ли поток
{
If (td.ThreadState == ThreadState.Running) //Затем определяем, запущен ли поток
{
td.Abort();//Закрыть поток, если он запущен
}
}
}
}
}
генерировать эскизы
Реализация этого примера в основном использует метод GetThumbnailImage класса Image для создания эскизов изображений. Сгенерированные эскизы помещаются в ListView. Чтобы предотвратить очень серьезное явление мерцания и повлиять на общий просмотр, в этом примере также переписывается элемент управления ListView, чтобы устранить явление мерцания.
public partial class Frm_Main : Form
{
public class CustomListView : ListView
{
public CustomListView()
{
SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
UpdateStyles();
}
}
CustomListView clv = new CustomListView();
public Frm_Main()
{
InitializeComponent();
}
string filePath;
public Image ResourceImage;
private int ImageWidth;
private int ImageHeight;
public string ErrMessage;
public Thread td;
public bool GetReducedImage(double Percent, string targetFilePath)
{
try
{
Bitmap bt = new Bitmap(120, 120);//Создать экземпляр Bitmap
Graphics g = Graphics.FromImage(bt);//Создаем экземпляр Graphics
//Устанавливаем белый цвет фона холста
// Миниатюра изображения Уменьшенное изображение; // Миниатюра
Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback);
ImageWidth = Convert.ToInt32(ResourceImage.Width * Percent);//Устанавливаем ширину
ImageHeight = Convert.ToInt32(ResourceImage.Height * Percent);//Устанавливаем высоту
// Получаем так называемый график
ReducedImage = ResourceImage.GetThumbnailImage(ImageWidth, ImageHeight, callb, IntPtr.Zero);
If (ImageWidth > ImageHeight) if (ImageWidth > ImageHeight) //Если исходная ширина изображения больше высоты
{
//Увеличить картинку
g.DrawImage(ReducedImage, 0, (int)(120 - ImageHeight) / 2, ImageWidth, ImageHeight);
}
else
{
g.DrawImage(ReducedImage, (int)(120 - ImageWidth) / 2, 0, ImageWidth, ImageHeight);
}
g.DrawRectangle(new Pen(Color.Gray), 0, 0, 119, 119);//Рисуем границу миниатюры
bt.Save(@targetFilePath, ImageFormat.Jpeg);//Сохраняем миниатюру
bt.Dispose();//Освобождаем объект
//ReducedImage.Dispose();//Освобождаем объект
return true;
}
catch (Exception e)
{
ErrMessage = e.Message;
return false;
}
}
public bool ThumbnailCallback()
{
return false;
}
private void a()
{
double percent;
string[] a = new string[2];
DirectoryInfo di = new DirectoryInfo(filePath);
FileSystemInfo[] fi = di.GetFileSystemInfos();
DirectoryInfo di2 = new DirectoryInfo("c:\\LsTemp");
for (int i = 0; i < fi.Length; i++)
{
string imgType = fi[i].ToString().Substring(fi[i].ToString().LastIndexOf(".") + 1, fi[i].ToString().Length - 1 - fi[i].ToString().LastIndexOf("."));
if (imgType.ToLower() == "jpeg" || imgType.ToLower() == "gif" || imgType.ToLower() == "png" || imgType.ToLower() == "jpg" || imgType.ToLower() == "bmp")
{
string imgName = fi[i].ToString();
imgName = imgName.Remove(imgName.LastIndexOf("."));
string newPath;
if (filePath.Length == 3)
{
newPath = filePath + imgName + "." + imgType;
}
else
{
newPath = filePath + "\" + imgName + "." + imgType;
}
ResourceImage = Image.FromFile(newPath);
if (ResourceImage.Width < ResourceImage.Height)
{
percent = (double)120 / ResourceImage.Height;
}
else
{
percent = (double)120 / ResourceImage.Width;
}
if (!di2.Exists)
{
Directory.CreateDirectory("c:\\LsTemp");
if (GetReducedImage(percent, "c:\\LsTemp\\_" + imgName + ".JPG"))
{
imageList1.Images.Add(i.ToString(), Image.FromFile("c:\\LsTemp\\_" + imgName + ".JPG"));
a[0] = imgName + "." + imgType;
ListViewItem lvi = new ListViewItem(a);
lvi.ImageKey = i.ToString();
clv.Items.Add(lvi);
}
}
else
{
if (GetReducedImage(percent, "c:\\LsTemp\\_" + imgName + ".JPG"))
{
imageList1.Images.Add(i.ToString(), Image.FromFile("c:\\LsTemp\\_" + imgName + ".JPG"));
a[0] = imgName + "." + imgType;
ListViewItem lvi = new ListViewItem(a);
lvi.ImageKey = i.ToString();
clv.Items.Add(lvi);
}
}
ResourceImage.Dispose();
}
tsslText.Text = "Всего" + this.clv.Items.Count.ToString() + "Изображения";
}
td.Abort();
}
private void toolStripButton1_Click_1(object sender, EventArgs e)
{
if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
{
clv.Items.Clear();
filePath = folderBrowserDialog1.SelectedPath;
td = new Thread(new ThreadStart(a));
td.Start();
}
}
private void toolStripButton2_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void deletefile()
{
try
{
DirectoryInfo di2 = new DirectoryInfo("c:\\LsTemp");
if (di2.Exists)
{
Scripting.FileSystemObject fso = new Scripting.FileSystemObject();
fso.DeleteFolder("c:\\LsTemp", true);
}
}
catch
{
deletefile();
}
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
if (td != null)
{
td.Abort();
}
deletefile();
}
private void clv_Click(object sender, EventArgs e)
{
if (clv.SelectedItems.Count > 0)
{
string pName = clv.SelectedItems[0].Text;
if (filePath.Length == 3)
{
tsslPath.Text = "Путь к изображению:" + filePath + pName;
}
else
{
tsslPath.Text = "Путь к изображению: " + filePath + "\" + pName;
}
}
}
private void clv_DoubleClick(object sender, EventArgs e)
{
if (clv.SelectedItems.Count > 0)
{
string pName = clv.SelectedItems[0].Text;
if (filePath.Length == 3)
{
System.Diagnostics.Process.Start(filePath + pName);
tsslPath.Text = "Путь к изображению:" + filePath + pName;
}
else
{
System.Diagnostics.Process.Start(filePath + "\" + pName);
tsslPath.Text = "Путь к изображению: " + filePath + "\" + pName;
}
}
}
private void Form1_Load(object sender, EventArgs e)
{
CheckForIllegalCrossThreadCalls = false;
panel1.Controls.Add(clv);
clv.Dock = DockStyle.Fill;
clv.LargeImageList = imageList1;
clv.View = View.LargeIcon;
clv.DoubleClick += new EventHandler(clv_DoubleClick);
clv.Click+=new EventHandler(clv_Click);
}
}
Поворачивайте и переворачивайте изображения
Изображение до поворота:
Повернутое изображение:
Для поворота изображения в основном используется метод RotateFlip класса Bitmap. Поверните и переверните изображение, когда придет этот метод.
Код:
private void button1_Click(object sender, EventArgs e)
{
openFileDialog1.Filter = "*.jpg|*.jpg";//Устанавливаем тип картинки
openFileDialog1.ShowDialog();//Открыть диалоговое окно файла
Image myImage = System.Drawing.Image.FromFile(openFileDialog1.FileName);//Создаем экземпляр класса Image
PictureBox1.Image = myImage;//Показать открытую картинку
}
private void button2_Click(object sender, EventArgs e)
{
Image myImage = pictureBox1.Image;//Создаем экземпляр класса Image
myImage.RotateFlip(RotateFlipType.Rotate90FlipXY);//Вызовите метод RotateFlip, чтобы повернуть изображение JPG
PictureBox1.Image = myImage;//Показать повернутое изображение
}
Отображает овальное изображение.
В основном используйте метод FillEllipse класса Graphics для отображения открытого изображения в виде эллипса.
private void button1_Click(object sender, EventArgs e)
{
this.panel1.Refresh();//Обновить панель управления
Graphics g = this.panel1.CreateGraphics();//Создаем экземпляр объекта рисования
TextureBrush MyBrush = new TextureBrush(MyBitmap);//Создаем экземпляр объекта TextureBrush
g.FillEllipse(MyBrush, this.panel1.ClientRectangle);//Рисуем эллипс
}