Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
 Аватар для Severnaya
0 / 0 / 0
Регистрация: 01.07.2015
Сообщений: 11

Программа для изменения свойств фотографии

01.07.2015, 19:45. Показов 3621. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте,
озадачили меня просьбой создать софтину, которая способна изменять определенные свойства фотографии, такие как:
"Название"
"Тема"
"Оценка"
"Ключевые слова" (надо учитывать что задается через ; )
"Автор"
"Авторские права".

Конечно, задач у софтины много больше. Но тут я встретилась с непреодолимым для меня лично препятствием.
Возможно ли изменение свойств фотографии посредством C#?
Если возможно, то как это реализовать? Как заставить программу работать именно со свойствами?
Совершенно не понимаю.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.07.2015, 19:45
Ответы с готовыми решениями:

Создать функцию для изменения свойств элементов
Имеются элементы на форме, например "listbox1", "combobox1", "form1", "textbox1", "button1" ... и т.д. Необходима функция, в которую...

Упрощение изменения свойств
Всем доброго времени суток. Столкнулся с проблемой. Собственно, существует форма, к примеру, с 10-ю элементами. Необходимо изменить...

Программа для изменения содержимого в браузерах
Здравствуйте, уважаемые программисты! Которую неделю ломаю голову: как же сделать такую программу, которая в во всех браузерах на...

23
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
01.07.2015, 20:29
Severnaya, http://www.developerfusion.com... -metadata/
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
01.07.2015, 20:30
Severnaya, берешь библиотеку Microsoft.WindowsAPICodePack.Shell и читаешь:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using Microsoft.WindowsAPICodePack.Shell;
using Microsoft.WindowsAPICodePack.Shell.PropertySystem;
...
string fileName = @"d:\_DSC0027.JPG";
using (ShellObject shellObject = ShellObject.FromParsingName(fileName))
{
    string title = GetValue(shellObject.Properties.GetProperty(SystemProperties.System.Title));
    string rating = GetValue(shellObject.Properties.GetProperty(SystemProperties.System.Rating));
    string keywords = GetValue(shellObject.Properties.GetProperty(SystemProperties.System.Keywords));
    string author = GetValue(shellObject.Properties.GetProperty(SystemProperties.System.Author));
    string copyright = GetValue(shellObject.Properties.GetProperty(SystemProperties.System.Copyright));
}
...
private static string GetValue(IShellProperty value)
{
    if (value == null || value.ValueAsObject == null)
    {
        return String.Empty;
    }
    
    return value.ValueAsObject.ToString();
}
Для изменения делаем так:
C#
1
2
3
4
5
6
7
using (ShellObject shellObject = ShellObject.FromParsingName(fileName))
{
    using (var writer = shellObject.Properties.GetPropertyWriter())
    {
        writer.WriteProperty(SystemProperties.System.Rating, "99");
    }
}
1
 Аватар для Severnaya
0 / 0 / 0
Регистрация: 01.07.2015
Сообщений: 11
10.07.2015, 18:39  [ТС]
Спасибо Вам за помощь!

Столкнулась с проблемой: предложенный Вами код считывания мета-данных считывает строки.
А такие пункты, как "Ключевые слова" "Автор" - являются строковыми массивами.
И при выводе полученных значений keywords и author мы получаем System.string [].
Что это и как с этим бороться?

Заранее спасибо за помощь.
0
140 / 133 / 88
Регистрация: 18.05.2013
Сообщений: 399
10.07.2015, 20:55
Severnaya, попробуйте так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
string fileName = @"d:\_DSC0027.JPG";
 
ShellObject shell = ShellObject.FromParsingName(fileName);
 
string title = shell.Properties.System.Title.FormatForDisplay(PropertyDescriptionFormatOptions.None);
string rating = shell.Properties.System.Rating.FormatForDisplay(PropertyDescriptionFormatOptions.None);
string keywords = shell.Properties.System.Keywords.FormatForDisplay(PropertyDescriptionFormatOptions.None);
string author = shell.Properties.System.Author.FormatForDisplay(PropertyDescriptionFormatOptions.None);
string copyright = shell.Properties.System.Copyright.FormatForDisplay(PropertyDescriptionFormatOptions.None);
 
Console.WriteLine("title= " + title);
Console.WriteLine("rating=" + rating);
Console.WriteLine("keywords=" + keywords);
Console.WriteLine("Autor=" + author);
Console.WriteLine("Copyright=" + copyright);
0
 Аватар для Severnaya
0 / 0 / 0
Регистрация: 01.07.2015
Сообщений: 11
10.07.2015, 22:06  [ТС]
Святыеяйцакотатимофея!! Это работает, благодарю Вас.

Добавлено через 8 минут
atoi, может Вы еще сможете подсказать как эти данные правильно менять?
нужно ли делать отдельное всплывающее окно?
0
140 / 133 / 88
Регистрация: 18.05.2013
Сообщений: 399
10.07.2015, 23:42
Severnaya, на этот вопрос вам ответил OwenGlendower. О каком всплывающем окне идет речь?
0
 Аватар для Severnaya
0 / 0 / 0
Регистрация: 01.07.2015
Сообщений: 11
10.07.2015, 23:52  [ТС]
atoi, если использовать метод, который предложил OwenGlendower, то программа работает с ошибкой, жалуется на "необработанное исключение типа..".
0
140 / 133 / 88
Регистрация: 18.05.2013
Сообщений: 399
11.07.2015, 00:11
Скопировал код, никаких исключений не получил, можете привести свой код и возникающую ошибку?
0
 Аватар для Severnaya
0 / 0 / 0
Регистрация: 01.07.2015
Сообщений: 11
11.07.2015, 00:23  [ТС]
Необработанное исключение типа "Microsoft.WindowsAPICodePack.Shell.Prop ertySystem.PropertySystemException" в Microsoft.WindowsAPICodePack.Shell.dll

Дополнительные сведения: Unable to get writable property store for this property.


C#
1
2
3
4
5
6
7
8
9
10
11
 private void textBox3_TextChanged ( object sender, EventArgs e )
        {
            string fileName = str[listBox1.SelectedIndex];
            using (ShellObject shellObject = ShellObject.FromParsingName(fileName))
            {
                using (var writer = shellObject.Properties.GetPropertyWriter())
                {
                    writer.WriteProperty(SystemProperties.System.Rating, "99");
                }
            }     
        }
0
140 / 133 / 88
Регистрация: 18.05.2013
Сообщений: 399
11.07.2015, 00:35
Оберните код в try/catch и выдавайте сообщение о том, что не удалось задать свойство. Скорее всего, этот файл имеет атрибут "только чтение".
0
 Аватар для Severnaya
0 / 0 / 0
Регистрация: 01.07.2015
Сообщений: 11
11.07.2015, 00:50  [ТС]
если менять мета-данные вручную, то все спокойно меняется.
а прораммно не получается.
0
140 / 133 / 88
Регистрация: 18.05.2013
Сообщений: 399
11.07.2015, 01:01
Проблема возникает со всеми файлами и при задании любого свойства?

P.s. для перевода значения, заданного в числах (рейтинг принимает значения от 0 до 99), в звезды, существует формула, вам необходимо из нее получить обратную формулу
C#
1
starRating = rating == 0 ? 0 : (uint)Math.Round((double)rating / 25.0) + 1;
0
 Аватар для Severnaya
0 / 0 / 0
Регистрация: 01.07.2015
Сообщений: 11
11.07.2015, 01:13  [ТС]
видимо, я что-то не понимаю.
необходимо, чтобы свойства задавал пользователь вводом с клавиатуры.
и программа вылетает, как только я пытаюсь что-нибудь напечатать.

если вместо rating пытаться ввести keywords, то выдает:

Необработанное исключение типа "System.NullReferenceException" в testapp.exe

Дополнительные сведения: Ссылка на объект не указывает на экземпляр объекта.
0
Заблокирован
11.07.2015, 01:25
Цитата Сообщение от Severnaya Посмотреть сообщение
необходимо, чтобы свойства задавал пользователь вводом с клавиатуры.
и программа вылетает, как только я пытаюсь что-нибудь напечатать.
Severnaya, показывайте код
0
 Аватар для Severnaya
0 / 0 / 0
Регистрация: 01.07.2015
Сообщений: 11
11.07.2015, 01:31  [ТС]
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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;
using Microsoft.WindowsAPICodePack.Shell;
using Microsoft.WindowsAPICodePack.Shell.PropertySystem;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        OpenFileDialog fd = new OpenFileDialog();//переменная для работы с диалоговым окном выбора файла
        Image[] img;
        string[] str;
        private void button1_Click(object sender, EventArgs e)//событие, возникающее при нажатии на кнопку
        {
            textBox1.Text = "";
            listBox1.Items.Clear();//очистка листбокса
            fd.Multiselect = true;//свойство, позволяющее выбрать в диалоговом окне >1 элемента
            fd.Filter = "изображения(*.jpg)|*.jpg";//фильтрация элементов диалогового окна
                                                   //(показывает только изображения формата jpg
            fd.InitialDirectory = @"C:\Documents and Settings\Admin\Рабочий стол";//директория, открывающаяся по 
                                                                                  //умолчанию в диалоговом окне
            fd.ShowDialog();//инициализация диалогового окна
            int i = 0;
            foreach (var item in fd.SafeFileNames)//цикл, перебиращий все выбранные элементы в диалоговом окне 
                                                  //и добавляющий их в листбокс, а их путь в текстбокс1
            {
                listBox1.Items.Add( item) ;
                textBox1.Text += fd.FileNames[i] + "\r\n";
                i++;
            }
            img = new Image[listBox1.Items.Count];//создаём массив изображений по количеству элементов листбокса
            str = fd.FileNames;//строковый массив, содержащий пути к выбранным изображениям(1 элемент массива=1картинка)
            for (i = 0; i < listBox1.Items.Count; i++)
            {
                img[i] = Image.FromFile(str[i]);//заполняем массив изображений картинками
            }
        }
 
        private void listBox1_DoubleClick(object sender, EventArgs e)
        {          
            
 
        }
        
        private void listBox1_Click(object sender, EventArgs e)
        {
            textBox2.Text = "";
            pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
            pictureBox1.Image = img[listBox1.SelectedIndex];//отображаем в PictureBox выбранную картинку из листбокса
            //foreach (var el in img[listBox1.SelectedIndex].PropertyIdList)//в нижний текстбокс записываем ид свойств картинки
              //  textBox2.Text += el + "\r\n";
            string fileName = str[listBox1.SelectedIndex];
 
            ShellObject shell = ShellObject.FromParsingName(fileName);
 
            string title = shell.Properties.System.Title.FormatForDisplay(PropertyDescriptionFormatOptions.None);
            string rating = shell.Properties.System.Rating.FormatForDisplay(PropertyDescriptionFormatOptions.None);
            string keywords = shell.Properties.System.Keywords.FormatForDisplay(PropertyDescriptionFormatOptions.None);
            string author = shell.Properties.System.Author.FormatForDisplay(PropertyDescriptionFormatOptions.None);
            string copyright = shell.Properties.System.Copyright.FormatForDisplay(PropertyDescriptionFormatOptions.None);
 
            textBox2.Text = title + "\r\n" + rating + "\r\n" + keywords + "\r\n" + author + "\r\n" + copyright; 
 
            this.Update();//перерисовываем форму
            
 
        }
        private static string GetValue ( IShellProperty value )
        {
            if (value == null || value.ValueAsObject == null)
            {
                return String.Empty;
            }
 
            return value.ValueAsObject.ToString();
        }
 
        private void listBox1_SelectedIndexChanged ( object sender, EventArgs e )
        {
 
        }
 
        private void textBox1_TextChanged ( object sender, EventArgs e )
        {
 
        }
 
        private void textBox3_TextChanged ( object sender, EventArgs e )
        {
            string fileName = str[listBox1.SelectedIndex];
            using (ShellObject shellObject = ShellObject.FromParsingName(fileName))
            {
                using (var writer = shellObject.Properties.GetPropertyWriter())
                {
                    writer.WriteProperty(SystemProperties.System.Title, "alex");
                }
            }     
        }
    }
}


0
140 / 133 / 88
Регистрация: 18.05.2013
Сообщений: 399
11.07.2015, 11:42
Что такое textBox3 и почему код находится в обработчике события TextChanged? Будет проще, если вы прикрепите проект.
Еще я посмотрел, например, у файлов с расширением png нет таких свойств, поэтому дополнительно стоит проверить наличие такого свойства:
C#
1
2
3
4
5
6
7
8
9
10
using (ShellObject shellObject = ShellObject.FromParsingName(fileName))
{
     ShellPropertyCollection props = new ShellPropertyCollection(shellObject);
 
     using (var writer = shellObject.Properties.GetPropertyWriter())
     {
         if (props.Contains(SystemProperties.System.Title))
            writer.WriteProperty(SystemProperties.System.Title, "alex");
     }
}
0
 Аватар для Severnaya
0 / 0 / 0
Регистрация: 01.07.2015
Сообщений: 11
11.07.2015, 12:05  [ТС]
testapp-v2.rar

я даже не представляю, как Вас отблагодарить, если Вы сможете в этом разобраться.
0
140 / 133 / 88
Регистрация: 18.05.2013
Сообщений: 399
11.07.2015, 13:42
Вам не удавалось задать значение из-за того, что изображение было загружено в pictureBox. Сейчас вроде все работает, проверьте. Вам осталось перевести рейтинг из звезд в значение от 0 до 99, добавить обработчики исключений.
Вложения
Тип файла: rar testapp.rar (665.8 Кб, 10 просмотров)
1
140 / 133 / 88
Регистрация: 18.05.2013
Сообщений: 399
11.07.2015, 13:49
В 104 строке ошибочка закралась,исправьте:
C#
1
SetValue(SystemProperties.System.Rating, tbRating.Text);
+ до загрузки изображения в pictureBox нужно сделать недоступным groupBox
Вложения
Тип файла: rar testapp.rar (667.0 Кб, 41 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.07.2015, 13:49
Помогаю со студенческими работами здесь

внешняя обработка для изменения свойств номенклатуры
1С восьмерка занимаюсь совсем недавно, так что может вопрос и простой, но для меня сложный ) ситуация: нужно изменить одно из...

Перебрать контроллы в цикле для изменения их свойств
Суть: есть label1, label2, label3 Можно ли вместо label1.Text = &quot;1&quot;; label2.Text = &quot;2&quot;; label3.Text = &quot;3&quot;; сделать что-то...

Перебрать все PictureBox в цикле для изменения их свойств
К примеру если в Си шарп есть 100 PictureBox(ов). Возможно ли организовать цикл к примеру такой: for (int i = 1; i &lt; 100; i++) ...

Программа для определения фигур с фотографии
Мне куратор задал задание, создать программу которая будет определять тип фигуры с фотографии, но я понятии не имею с чего начать) есть у...

Скрытый опрос по фотографии. Анонимный комментарий для фотографии
Ребят такая проблема, не могу разобраться как сделать. задача такая есть детские фотографии пользователям нужно отгадать кто на ней...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru