Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Запись и чтение параметров изображения в текстовый


Автор: Game1024 14.1.2010, 04:20
Здравствуйте.
Создаю приложение, которое способно загружать изображение,  изменять его параметры путем перемещения скроллов, сохранять параметры в текстовый файл и считывать их оттуда.

Исходный код 
Скрытый текст
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace arbuzzz
{
    
    public partial class Form1 : Form
    {
        double aspect;
        string image_path;
    
        public Form1()
        {
            InitializeComponent();
            pictureBox1.Left = 0;
            pictureBox1.Top = 0;
            pictureBox1.Width = 200;
            pictureBox1.Height = 150;
            pictureBox1.SizeMode = PictureBoxSizeMode.AutoSize;
            hScrollBar3.Maximum = this.Size.Width;
            hScrollBar4.Maximum = this.Size.Width;

        }

        private void оПрограммеToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("hello world?");
        }

        private void открытьИзображениеToolStripMenuItem_Click(object sender, EventArgs e)
        {
            OpenFileDialog openfiledialog = new OpenFileDialog();
            openfiledialog.Filter = "png files (*.png)|*.png|All files (*.*)|*.*";
            openfiledialog.FilterIndex = 2;
            openfiledialog.RestoreDirectory = true;
            if (openfiledialog.ShowDialog() == DialogResult.OK)
            {
                if (openfiledialog.OpenFile() != null)
                {
                    pictureBox1.Image = System.Drawing.Image.FromFile(openfiledialog.FileName);
                    pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
                    hScrollBar2.Maximum = pictureBox1.Height * 2;
                    hScrollBar2.Value = pictureBox1.Height;
                    textBox2.Text =  pictureBox1.Height.ToString();
                    hScrollBar1.Maximum = pictureBox1.Width * 2;
                    hScrollBar1.Value = pictureBox1.Width;
                    textBox1.Text = pictureBox1.Width.ToString();
                    aspect = Convert.ToDouble(pictureBox1.Image.Width) / Convert.ToDouble(pictureBox1.Image.Height);
                    image_path = openfiledialog.FileName.ToString();
                    
                    pictureBox1.Width = hScrollBar1.Value;
                    textBox1.Text = pictureBox1.Width.ToString();
                    pictureBox1.Height = hScrollBar2.Value;
                    textBox2.Text = pictureBox1.Height.ToString();

                    if (checkBox1.Checked)
                    {
                        pictureBox1.Width = Convert.ToInt16(hScrollBar1.Value / aspect);
                        textBox1.Text = pictureBox1.Width.ToString();
                        hScrollBar1.Value = pictureBox1.Width;

                        pictureBox1.Height = Convert.ToInt16(hScrollBar2.Value / aspect);
                        textBox2.Text = pictureBox1.Height.ToString();
                        hScrollBar2.Value = pictureBox1.Height;  

                    }

                }
            }
            

        }

        private void открытьФайлПараметровToolStripMenuItem_Click(object sender, EventArgs e)
        {
            System.IO.Stream myStream;
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Filter = "Txt files (*.txt)|*.txt|All files (*.*)|*.*";
            openFileDialog.FilterIndex = 1;
            openFileDialog.RestoreDirectory = true;
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                if ((myStream = openFileDialog.OpenFile()) != null)
                {
                    System.IO.StreamReader rw = new System.IO.StreamReader(myStream);
                    string line;
                    while ((line = rw.ReadLine()) != null)
                    {
                        listBox1.Items.Add(line);
                        //Если в строке есть параметр Path, то извлекаем его значение и загружаем изображение
                        if (line.IndexOf("Path=") != -1)
                        {
                            pictureBox1.Image = System.Drawing.Image.FromFile(line.Substring(5));
                            image_path = line.Substring(5);
                            pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
                            hScrollBar2.Maximum = pictureBox1.Height * 2;
                            hScrollBar2.Value = pictureBox1.Height;
                            textBox2.Text = pictureBox1.Height.ToString();
                            hScrollBar1.Maximum = pictureBox1.Width * 2;
                            hScrollBar1.Value = pictureBox1.Width;
                            textBox1.Text = pictureBox1.Width.ToString();
                            aspect = Convert.ToDouble(pictureBox1.Image.Width) / Convert.ToDouble(pictureBox1.Image.Height);

                            pictureBox1.Width = hScrollBar1.Value;
                            textBox1.Text = pictureBox1.Width.ToString();
                            pictureBox1.Height = hScrollBar2.Value;
                            textBox2.Text = pictureBox1.Height.ToString();
                        }
                        if (line.IndexOf("Width=") != -1)
                        {

                        }
                    }
                }
            }
        }

        private void hScrollBar1_Scroll(object sender, ScrollEventArgs e)
        {
             pictureBox1.Width = hScrollBar1.Value;
             textBox1.Text = pictureBox1.Width.ToString();
                        
        }

        private void hScrollBar2_Scroll(object sender, ScrollEventArgs e)
        {
             pictureBox1.Height = hScrollBar2.Value;
             textBox2.Text = pictureBox1.Height.ToString();

        }

        private void сохранитьПараметрыToolStripMenuItem_Click(object sender, EventArgs e)
        {
            System.IO.Stream myStream;
            SaveFileDialog saveFileDialog = new SaveFileDialog();
            saveFileDialog.Filter = "Txt files (*.txt)|*.txt|All files (*.*)|*.*";
            saveFileDialog.FilterIndex = 1;
            saveFileDialog.RestoreDirectory = true;
            if (saveFileDialog.ShowDialog() == DialogResult.OK)
              {
               if ((myStream = (System.IO.FileStream)saveFileDialog.OpenFile()) != null)
                 {
                  System.IO.StreamWriter sw = new System.IO.StreamWriter(myStream);
                  //сохраняем параметры
                  sw.WriteLine("Path = C:\arbuz.txt");
                  sw.WriteLine("Width = {0}",pictureBox1.Width.ToString());
                  sw.WriteLine("Height = {0}", pictureBox1.Height.ToString());
                  sw.WriteLine("Top = {0}", pictureBox1.Top.ToString());
                  sw.WriteLine("Left = {0}",  pictureBox1.Left.ToString());
                  sw.WriteLine("SaveAspect = {0}", aspect.ToString());
                  sw.Close();
                 }
                }
                    }
                              
    }
}


Загвоздка произошла в  функции для чтения файла параметров.
// Если в строке есть параметр Width 
if (line.IndexOf("Width=") != -1)
// то читаем его и назначаем

 {
   }
//Если в строке есть параметр Height, то читаем его и назначаем
и т.д.
Каким образом прочитать значение Width из файла назначить его?

Также где-то должен быть дублирующаяся часть кода (вероятно настройки скроллов Width.Maximum, Height.Maximum, Height.Value, Width.Value, aspect , pictureBox1.SizeMode)

Буду благодарен за ответы.



Автор: Экскалупатор 14.1.2010, 10:33
Game1024, привет.
 smile 
во-первых, тот факт что ты недавно на форуме не отменяет необходимость оборачивания кода в теги.
во-вторых, ты б разобрался со структурой твоей программы. это просто жесткач какой-то. все вперемешку. русские названия. вот ты же сам пишешь "функция чтения файла" а где она? правильно! в обработчике события! ей там самое место!

Цитата(Game1024 @  14.1.2010,  03:20 Найти цитируемый пост)
Каким образом прочитать значение Width из файла назначить его?

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


Автор: Game1024 14.1.2010, 15:54
В спойлер не хочет сворачиваться.
По вопросу - функция открыть файл параметров и и есть функция чтения.
При нажатии на кнопку открывает файл,считывает в нем параметры и применяет их к изображению.
Конкретно загвоздка такая: в файле есть строка
Width=345.
Мне нужно прочитать значение и назначить его.
if (line.IndexOf("Width=") != -1)
//далее читаем и назначаем.Каким образом можно прочитать значение "345"

Автор: Экскалупатор 14.1.2010, 17:52
можно так:
Код

string str = "Width=345";
            string str0 = "Width=";
            string strResult = str.Remove(0, str0.Length);
            int i = Int32.Parse(strResult);

Автор: newbieBH 14.1.2010, 17:54
если я правильно понял то что нужно, то можно считать так ... 
Код

            int value;
            string[] str = line.Split('=');
            if (int.TryParse(str[1].Trim(), out value))
            {
            }

Автор: Game1024 14.1.2010, 20:28
Цитата(Экскалупатор @  14.1.2010,  17:52 Найти цитируемый пост)
можно так:КодincludeSyntax('csharp');string str = "Width=345";            string str0 = "Width=";            string strResult = str.Remove(0, str0.Length);            int i = Int32.Parse(strResult);

дальше,если я правильно понял, присваиваем i = pictureBox1.Width,и
textBox1.Text = pictureBox1.Width.ToString();  
? 
(в textBox1.Text отображается width изображения)

Но все  равно не работает

Автор: Экскалупатор 14.1.2010, 21:30
Цитата(Game1024 @  14.1.2010,  19:28 Найти цитируемый пост)
дальше,если я правильно понял, присваиваем i = pictureBox1.Width,и
textBox1.Text = pictureBox1.Width.ToString();  
? 
(в textBox1.Text отображается width изображения)

Но все  равно не работает 


эээ... я не понял...

это что? почему ты переменной i присваиваешь ширину контрола? надо ноборот:
Код

pictureBox1.Width = i; 
textBox1.Text = i.ToString(); 

Автор: Game1024 14.1.2010, 22:49
Цитата(Экскалупатор @  14.1.2010,  21:30 Найти цитируемый пост)
дальше,если я правильно понял, присваиваем i = pictureBox1.Width,иtextBox1.Text = pictureBox1.Width.ToString();  ? (в textBox1.Text отображается width изображения)Но все  равно не работает эээ... я не понял...это что? почему ты переменной i присваиваешь ширину контрола? надо ноборот:КодincludeSyntax('csharp');pictureBox1.Width = i; textBox1.Text = i.ToString(); 


Лишь присваивает значение textBox и изображению,но не считывает это значение из файла

Автор: Экскалупатор 14.1.2010, 22:57
Game1024, спасибо. но если честно все это мягко говоря шило. твоя программа похожа на программу человека который изучает язык первую неделю. почитай про ООП. про рефакторинг. конкретно для этой программы очень бы хорошо было использовать XML. выполнять весь код прямо в обработчике это не айс. это будет выглядеть нормально только для тебя и только в том случае если у тебя всего три четыре обработчика, и только одна форма. в остальных случаях это все равно что усложнять себе жизнь.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)