Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Назначение свойств изображению / 19 сообщений из 19, страница 1 из 1
18.05.2015, 20:24
    #38962020
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Назначение свойств изображению
У меня была задача номер 1. Назначить новой картинке свойства, которые отображаются в ее свойствах (каламбурчик-с ). Типа всяких названий камер, даты съемки и тому подобного.
Это я сделал

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Image img = Image.FromFile(name);
                List<PropertyItem> pis = img.PropertyItems.ToList<PropertyItem>();

Image imgnew = resizeImage(img,x[p],y[p]);// это функция такая самописная, которая меняет размер.
...

 foreach (PropertyItem pi in pis)
                    {
                        imgnew.SetPropertyItem(pi);
                    }



Что мне понравилось, что размеры картинки не тупо скопировались, а стали правильными.

Но тут меня обуяла гордыня и я решил некоторые свойства поменять. Например, вставить себя в авторы (все по-честному - это мои фотки), или сделать название на русском. Если получится, то можно замахнуться на теги и на комменты!

Самое лучшее что я нашел в интернете (Cлава нашему форуму! Ура!)

Чтение File Info из jpg
Из своих исследований и из этого топика я вынес следующее:

Автор хранится то ли в PropertyItem, где Id=40093 (это из топика), то ли PropertyItem, где Id=315 (это из моих исследований).

Но тут засада и выскочила.

В Win7 в проводнике можно записать автора вручную. Если так сделать, то PropertyItem с id=315 появляется.
PropertyItem c Id=40093 вообще у одной камеры есть, а у другой нет.

У меня после ручного ввода с id=315 появлялся и я ему прекрасно менял значения.

Итак, если их нет?

Казалось бы можно просто добавить в PropertyItems новый экземпляр с нужным Id, но оказалось, что у PropertyItem нет конструктора.

Я придумал "хитрый" ход. Нахожу "ненужный" экземпляр и меняю ему ему Id и свойства, но это как-то неаккуратно.
Вдруг он нужен где-то, а я его меняю?
Вдруг он когда-нибудь автоматически сбросит значения, как сбрасываются и заменяются значения размеров?

Ведь вручную PropertyItem с Id=315 как-то добавляется!!!

Так как же мне правильно увековечить свое имя в свойствах фотки?
============
Примечание
Функция resizeImage, которую я нагло спер где-то в интернете
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
public static Image resizeImage(Image srcImg, int widthToUse, int heightToUse)
        {
            // create the output bitmap 
            Bitmap newBitmap = new Bitmap(widthToUse, heightToUse);

            // create a Graphics object to draw into it 
            Graphics g = Graphics.FromImage(newBitmap);
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;

            // draw it with the new size 
            g.DrawImage(srcImg, 0, 0, widthToUse, heightToUse);

            return newBitmap;
        }

...
Рейтинг: 0 / 0
18.05.2015, 20:27
    #38962024
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Назначение свойств изображению
было бы не вредно ознакомиться со спецификацией EXIF

а из тулзов рекомендую exiftool
...
Рейтинг: 0 / 0
18.05.2015, 20:35
    #38962030
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Назначение свойств изображению
Изопропилбыло бы не вредно ознакомиться со спецификацией EXIF

а из тулзов рекомендую exiftool

1. Где Вы рекомендуете с ней ознакомится? Как мне поможет полное знание этого стандарта, если я не могу добавить к описанию пункт стандартными средствами C#?
2. Мне не нужны тулзы. Все нужное мне прекрасно делается в Проводнике Win 7.
...
Рейтинг: 0 / 0
18.05.2015, 20:42
    #38962037
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Назначение свойств изображению
Cat21. Где Вы рекомендуете с ней ознакомится?
http://www.exiv2.org/tags.html

Cat2Как мне поможет полное знание этого стандарта, если я не могу добавить к описанию пункт стандартными средствами C#?
описание стандарта позволяет осознать разницу между 315 и 40093
...
Рейтинг: 0 / 0
18.05.2015, 20:47
    #38962042
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Назначение свойств изображению
ИзопропилCat21. Где Вы рекомендуете с ней ознакомится?
http://www.exiv2.org/tags.html

Cat2Как мне поможет полное знание этого стандарта, если я не могу добавить к описанию пункт стандартными средствами C#?
описание стандарта позволяет осознать разницу между 315 и 40093
Спасибо, осознал

А толку то, если ни 315, ни 40093 не могу программно создать
...
Рейтинг: 0 / 0
18.05.2015, 20:58
    #38962048
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Назначение свойств изображению
Cat2А толку то, если ни 315, ни 40093 не могу программно создать
мне как-то ближе http://freeimage.sourceforge.net/index.html

c# враппер имеется
...
Рейтинг: 0 / 0
18.05.2015, 21:08
    #38962056
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Назначение свойств изображению
Cat2,

Буквально недавно копался с PropertyItem -хозяйством по своим делам.
Посмотри, никак не поможет?

Как в .Net выкапывать свойства и значения из PropertyItems GDI+-совместимого файла?

Там под спойлером целая простыня еще из этих тагов.
...
Рейтинг: 0 / 0
18.05.2015, 21:15
    #38962061
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Назначение свойств изображению
Дмитрий77Cat2,

Буквально недавно копался с PropertyItem -хозяйством по своим делам.
Посмотри, никак не поможет?

Как в .Net выкапывать свойства и значения из PropertyItems GDI+-совместимого файла?

Там под спойлером целая простыня еще из этих тагов.
Как выкапывать я тоже нашел .


Это код не выводит ничего нужного мне со свежей фотки с камеры Nikon

Код: 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.
static void Main(string[] args)
        {

            {
                Bitmap image = new Bitmap(@"C:\inetpub\wwwroot\img\zhukov - копия\DSCN0298.JPG");
                UnicodeEncoding encoding = new UnicodeEncoding();

                foreach (PropertyItem propItem in image.PropertyItems)
                {
                    switch (propItem.Id)
                    {
                        case 0x013b: //315
                            Console.WriteLine("author: " + encoding.GetString(propItem.Value));
                            break;

                        case 0x9c9b:
                            Console.WriteLine("title: " + encoding.GetString(propItem.Value));
                            break;
                        case 0x9c9c:
                            Console.WriteLine("comments: " + encoding.GetString(propItem.Value));
                            break;
                        case 0x9c9d:
                            Console.WriteLine("author2: " + encoding.GetString(propItem.Value));
                            break;
                        case 0x9c9e:
                            Console.WriteLine("keywords: " + encoding.GetString(propItem.Value));
                            break;
                        case 0x9c9f:
                            Console.WriteLine("subject: " + encoding.GetString(propItem.Value));
                            break;
                    }
                }
                Console.ReadLine();

            }
...
Рейтинг: 0 / 0
18.05.2015, 21:24
    #38962064
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Назначение свойств изображению
ИзопропилCat2А толку то, если ни 315, ни 40093 не могу программно создать
мне как-то ближе http://freeimage.sourceforge.net/index.html

c# враппер имеется
Там под юникс. Уж ради этой мелкой задачи я его ставить не буду
...
Рейтинг: 0 / 0
18.05.2015, 21:27
    #38962065
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Назначение свойств изображению
Cat2Там под юникс. Уж ради этой мелкой задачи я его ставить не буду
неправда - есть вариант под винду в виде exe
...
Рейтинг: 0 / 0
18.05.2015, 21:30
    #38962066
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Назначение свойств изображению
ИзопропилCat2Там под юникс. Уж ради этой мелкой задачи я его ставить не буду
неправда - есть вариант под винду в виде exe
это я по exiftool

dll c freeimage под винду есть с шарповым враппером - http://freeimage.sourceforge.net/download.html

а что касается никона - он может увековечить автора и в 37510 User Comment
...
Рейтинг: 0 / 0
18.05.2015, 21:58
    #38962085
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Назначение свойств изображению
ИзопропилИзопропилпропущено...

неправда - есть вариант под винду в виде exe
это я по exiftool

dll c freeimage под винду есть с шарповым враппером - http://freeimage.sourceforge.net/download.html

а что касается никона - он может увековечить автора и в 37510 User Comment
Ну ты и задачки задаешь!
В коде freeimage слово ProprtyItem не найдено,да т вообще я плюсы давно и надежно забыл.

>>а что касается никона - он может увековечить автора и в 37510 User Comment
Не. Там тоже пусто
...
Рейтинг: 0 / 0
18.05.2015, 22:04
    #38962090
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Назначение свойств изображению
Cat2В коде freeimage слово ProprtyItem не найдено,
а и не должно быть - за пропертиитемами скрываются просто exif данные
плюсы не нужны - там же есть сишарпная обёртка

кинь ссылку на jpeg - гляну что там внутри
...
Рейтинг: 0 / 0
18.05.2015, 22:05
    #38962091
ZhV
ZhV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Назначение свойств изображению
Cat2
Но тут меня обуяла гордыня и я решил некоторые свойства поменять. Например, вставить себя в авторы (все по-честному - это мои фотки), или сделать название на русском. Если получится, то можно замахнуться на теги и на комменты!

Самое лучшее что я нашел в интернете (Cлава нашему форуму! Ура!)

Чтение File Info из jpg
...


Рекомендую
ExifLibrary for .NET

Очень редкая фича - вытаскивать и редактировать EXIF параметры без создания bitmap.
Заодно очень полезно - довольно полная enum-спецификация EXIF-items.
Ну и главное - абсолютно открытый код без всяких внешних "волшебных" dll-врапперов.
...
Рейтинг: 0 / 0
18.05.2015, 22:27
    #38962098
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Назначение свойств изображению
Cat2Как выкапывать я тоже нашел .
Других задач передо мной к сожалению не стояло.
Все что я делал - просто сравнивал исходный файл с заданным target форматом, читая его тэги (компрессия, размер изображения, разрешение) и при несоответствии подгонял формат к заданному средствами GDI+ (Graphics то бишь).

Одно могу сказать с уверенностью. Чтобы на эту тему какие-то задачи нормально решать, .Net -доков недостаточно.
Надо читать родные GDI+ доки, искать C++ примеры, а м.б. и углубляться в спецификацию этого дела.
Меня (для моей задачи) спасло только то что были "native" - коды.
...
Рейтинг: 0 / 0
18.05.2015, 22:34
    #38962102
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Назначение свойств изображению
Дмитрий77а м.б. и углубляться в спецификацию этого дела.
только это и нужно
...
Рейтинг: 0 / 0
19.05.2015, 09:46
    #38962251
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Назначение свойств изображению
Проблема решена

Цитата из ПТ
Cat2H.A.M.ради интереса зашел в MSDN, ба да это прелестно:

https://msdn.microsoft.com/en-us/library/system.drawing.image.getpropertyitem.aspx

It is difficult to set property items, because the PropertyItem class has no public constructors. One way to work around this restriction is to obtain a PropertyItem by retrieving the PropertyItems property value or calling the GetPropertyItem method of an Image that already has property items. Then you can set the fields of the PropertyItem and pass it to SetPropertyItem.

Клевый API (:
кароче делаешь картинку 1х1 и ставишь там какой-нить проперти. Ложишь в ресурсы и из нее тащишь объекты PropertyItem.
Ну просто великолепно! Индусы рулят.
Спасибо, что понял за меня, так как прочитать я сам смог

Тупо так и сделал. Рисунок 1х1 в ресурсы, записал вручную ему нужные свойства, а в проге или просто вставляю или перед этим меняю значения.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
PropertyItem propertyItem = propertyItemsResource.First<PropertyItem>(w => w.Id == 270);
propertyItem.Value = Encoding.UTF8.GetBytes(String.Format("{0}. Фото {1}\0", rusTextBox.Text, i + 1));
imgnew.SetPropertyItem(propertyItem);

int[] efix = new int[] { 315, 40091, 40092, 40094 };
foreach (int ef in efix)
                    {
                        propertyItem = propertyItemsResource.First<PropertyItem>(w => w.Id == ef);
                        imgnew.SetPropertyItem(propertyItem);
                    }
...
Рейтинг: 0 / 0
19.05.2015, 11:01
    #38962371
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Назначение свойств изображению
...
Рейтинг: 0 / 0
19.05.2015, 18:13
    #38963194
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Назначение свойств изображению
pation,

Спасибо, глянул. К счастью у меня разовая задача и мне не надо все это углубленно изучать
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Назначение свойств изображению / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]