powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Готовые методы для базовой работы с изображениями
17 сообщений из 17, страница 1 из 1
Готовые методы для базовой работы с изображениями
    #39541584
__Pavel__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую!

Делаю проект, который работает с графикой и в процессе разработки разжился полезными базовыми методами, которыми хочу поделиться, вдруг кому будет полезным или вдруг кто найдет ошибку ;) но вроде все работает ровно =)

Здесь присутствуют методы получения информации о изображении (которые можно легко дополнить), а так же методы изменения размера изображений (в пикселях или мм) и методы конвертации разных систем измерения


КодКласс с методами
Код: 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.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.IO;
using System.Linq;

namespace ThisProject
{
    public static class Core
    {
        public static ImageInfoLow GetImageInfoLow(Image p_Image, bool p_Dispose)
        {
            ImageInfoLow II = new ImageInfoLow();

            using (var G = Graphics.FromImage(p_Image))
            {
                II.SizeInPx = new Size(p_Image.Width, p_Image.Height);
                II.SizeInMM = new SizeF(PixelsToMM(G.DpiX, p_Image.Width), PixelsToMM(G.DpiY, p_Image.Height));
                II.DpiX = G.DpiX;
                II.DpiY = G.DpiY;
            }

            if (p_Dispose == true)
            {
                p_Image.Dispose();
                p_Image = null;
            }

            return II;
        }

        public static ImageInfo GetImageInfo(string p_Path)
        {
            ImageInfo II;
            FileInfo FI = new FileInfo(p_Path);
            if (FI.Exists == false) return new ImageInfo();
            II = GetImageInfoLow(Image.FromFile(p_Path), true).ToImageInfo();
            II.Path = FI.FullName;
            II.Name = FI.Name;
            FI = null;

            return II;
        }

        public static SizeF GetSizeImageInMM(Image p_Image, bool p_Dispose)
        {
            return GetImageInfoLow(p_Image,p_Dispose).SizeInMM;
        }

        public static SizeF GetSizeImageInMM(string p_Path)
        {
            return GetImageInfo(p_Path).SizeInMM;
        }

        public static Image ResizeImageInPx(Image imgToResize, int p_NewWidth, int p_NewHeight)
        {
            Graphics G;
            Bitmap BM;

             //Создаем новый пустой битмап с параметрами старого
            G = Graphics.FromImage(imgToResize);
            BM = new Bitmap(p_NewWidth, p_NewHeight, G);
            G.Dispose();

            //Рисуем масштабированое изображение в новый битмап
            G = Graphics.FromImage(BM);
            G.InterpolationMode = InterpolationMode.HighQualityBicubic;
            G.DrawImage(imgToResize, 0, 0, p_NewWidth, p_NewHeight);
            G.Dispose();

            return (Image)BM;
        }
        
        public static Image ResizeImageInPx(Image p_Image, int p_MaxWidth)
        {
            return ResizeImageInPx(p_Image, p_MaxWidth, Convert.ToInt32(p_Image.Height / (p_Image.Width / p_MaxWidth)));
        }

        public static Image ResizeImageInMM(Image p_Image, float p_DpiX, float p_NewWidth, float p_DpiY, float p_NewHeight)
        {
            return ResizeImageInPx(p_Image, (int)MMToPixels(p_DpiX, p_NewWidth), (int)MMToPixels(p_DpiY, p_NewHeight));
        }

        public static Image ResizeImageInMM(Image p_Image, float p_DpiX, float p_MaxWidth, float p_DpiY)
        {
            return ResizeImageInPx(p_Image, (int)MMToPixels(p_DpiX, p_MaxWidth), (int)MMToPixels(p_DpiY, Convert.ToInt32(p_Image.Height / (p_Image.Width / p_MaxWidth))));
        }

        public static Image OpenImageOrDefault(string p_Path)
        {
            if (File.Exists(p_Path))
                return Image.FromFile(p_Path);
            else
                return null;
        }

        public static float MMToPt(float p_Value)
        {
            return p_Value * 2.834645669f;
        }

        public static float PtToMM(float p_Value)
        {
            return p_Value / 2.834645669f;
        }

        public static float MMToIn(float p_Value)
        {
            return p_Value * 0.0393701f * 100;
        }

        public static float InToMM(float p_Value)
        {
            return (p_Value / 0.0393701f) / 100;
        }

        public static float MMToPixels(float p_Dpi, float p_Value)
        {
            return p_Value * (p_Dpi / 25.4f);
        }

        public static float PixelsToMM(float p_Dpi, float p_Value)
        {
            return p_Value / (p_Dpi / 25.4f);
        }

    }
}



Классы типов
Код: 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.
public class ImageInfo
    {
        public string Name { get; set; }
        public string Path { get; set; }
        public SizeF SizeInMM { get; set; }
        public Size SizeInPx { get; set; }
        public float DpiX { get; set; }
        public float DpiY { get; set; }

        public ImageInfo() { }

        public ImageInfoLow ToImageInfoLow() => new ImageInfoLow()
        {
            SizeInMM = SizeInMM,
            SizeInPx = SizeInPx,
            DpiX = DpiX,
            DpiY = DpiY
        };

        public ImageInfo Copy()
        {
            ImageInfo II = new ImageInfo();
            II.Name = Name;
            II.Path = Path;
            II.SizeInMM = SizeInMM;
            II.SizeInPx = SizeInPx;
            II.DpiX = DpiX;
            II.DpiY = DpiY;
            return II;
        }

    }

 public class ImageInfoLow
    {
        public SizeF SizeInMM { get; set; }
        public Size SizeInPx { get; set; }
        public float DpiX { get; set; }
        public float DpiY { get; set; }


        public ImageInfoLow() { }

        public ImageInfo ToImageInfo() => new ImageInfo()
        {
            Path = "",
            Name = "",
            SizeInMM = SizeInMM,
            SizeInPx = SizeInPx,
            DpiX = DpiX,
            DpiY = DpiY
        };

        public ImageInfoLow Copy()
        {
            ImageInfoLow II = new ImageInfoLow();
            II.SizeInMM = SizeInMM;
            II.SizeInPx = SizeInPx;
            II.DpiX = DpiX;
            II.DpiY = DpiY;
            return II;
        }
    }



П.С. может кто подскажет хорошую рабочую библиотеку для работы с изображениями, а именно с фильтрами и обязательно бесплатную. Нужно делать изображение Ч/Б, потом повышать резкость, осветлять фон, находить края (выделять) для последующего распознавания. Пользуюсь одной библиотекой, но там фильтры ненастраиваемые из-за этого обработка происходит долго (иногда больше 5 секунд), если изображение большое.
...
Рейтинг: 0 / 0
Готовые методы для базовой работы с изображениями
    #39541739
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OpenCV
...
Рейтинг: 0 / 0
Готовые методы для базовой работы с изображениями
    #39541761
__Pavel__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

Пользуюсь AForge, т.к. OpenCV несколько сложный для меня хотя бы тем, что у него нет нормальной интеграции с С#, а у AForge есть. Тем более распознавание уже работает, проблема лишь в предобработке изображения...
...
Рейтинг: 0 / 0
Готовые методы для базовой работы с изображениями
    #39541788
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Pavel__,

"никакой интеграции"
https://www.nuget.org/packages/OpenCV.Net/
...
Рейтинг: 0 / 0
Готовые методы для базовой работы с изображениями
    #39542041
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
__Pavel__Здесь присутствуют методы получения информации о изображении
Тот случай, когда нужны комментарии.


__Pavel__может кто подскажет хорошую рабочую библиотеку для работы с изображениями
Да какие проблемы самому написать? На уровень API вылезать не надо, все можно сделать стандартными библиотеками NET
...
Рейтинг: 0 / 0
Готовые методы для базовой работы с изображениями
    #39542077
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2__Pavel__Здесь присутствуют методы получения информации о изображении
Тот случай, когда нужны комментарии.


__Pavel__может кто подскажет хорошую рабочую библиотеку для работы с изображениями
Да какие проблемы самому написать? На уровень API вылезать не надо, все можно сделать стандартными библиотеками NET
Ну далеко не всё есть в убогих стандартных средствах
...
Рейтинг: 0 / 0
Готовые методы для базовой работы с изображениями
    #39542124
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,
+1 Соседний топик банальный превью руками пишет. Или галерею фоток на странице.
...
Рейтинг: 0 / 0
Готовые методы для базовой работы с изображениями
    #39542162
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилOpenCV
Да, неплохо они продвинулись, в последней версии уже автоматом задействуются OCL-вычисления
https://opencv.org/platforms/opencl.html In OpenCV-3.x the architecture concept has been changed to the so-called Transparent API (T-API). In the new architecture a separate OpenCL-accelerated cv::ocl::resize() is removed from external API and becomes a branch in a regular cv::resize(). This branch is called automatically when it’s possible and makes sense from the performance point of view. The T-API implementation was sponsored by AMD and Intel companies.
Пока CUDA выглядит, пожалуй, помощней, однако, если сравнивать бюджеты NVIDIA vs AMD+Intel, перспективней выглядит OpenCL.
...
Рейтинг: 0 / 0
Готовые методы для базовой работы с изображениями
    #39542170
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LR,
У OpenCV была специализация на распознование лиц по фото. Это всё таки специфично. Как счас, не знаю.
...
Рейтинг: 0 / 0
Готовые методы для базовой работы с изображениями
    #39542183
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

Computer Vision гораздо больше чем "распознование лиц по фото". И пожалуй да, CV все же специфично... это не просто "библиотека для работы с изображениями".
...
Рейтинг: 0 / 0
Готовые методы для базовой работы с изображениями
    #39542631
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Pavel__,

Библиотека - гавно
почему:
1. Имена режут глаз ( почитай как нужно именовань )
2. 2 типа (ImageInfo и ImageInfoLow) явно должны наследоваться один из другого
3. Константы в коде
4. Непонятный метод Copy вместо использования ICloneable
5. Отсутствие комментариев
...
Рейтинг: 0 / 0
Готовые методы для базовой работы с изображениями
    #39542745
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pation,

6. Этот кусок вообще убил наповал
if ( p_Dispose == true )
{
p_Image.Dispose();
p_Image = null;
}
...
Рейтинг: 0 / 0
Готовые методы для базовой работы с изображениями
    #39542790
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ИзопропилНу далеко не всё есть в убогих стандартных средствах
Если чего не хватает - всегда можно написать самому.

А не искать на каждый чих готовую библиотеку.

Попиксельная обработка есть? Есть. Значит результат зависит только от квалификации и фантазии
...
Рейтинг: 0 / 0
Готовые методы для базовой работы с изображениями
    #39542869
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2ИзопропилНу далеко не всё есть в убогих стандартных средствах
Если чего не хватает - всегда можно написать самому.

А не искать на каждый чих готовую библиотеку.

Попиксельная обработка есть? Есть. Значит результат зависит только от квалификации и фантазии

Есть ещё фактор времени, затраченного на пограммирование и быстродействия полученного кода ( использование AVX, OpenCl,CUDA)
Да и скалярный код неплохо чтоб бвл собран приличным C компилятором, например интеловским
...
Рейтинг: 0 / 0
Готовые методы для базовой работы с изображениями
    #39542888
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Готовые методы для базовой работы с изображениями
    #39544598
__Pavel__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pation,

1. Не нравится, не читайте! Кодирую не на заказ, мне норм.
2. Что не так с освобождением ресурсов? Флаг нужен для того, чтобы НЕ убивать ресурс, если этого НЕ надо.
...
Рейтинг: 0 / 0
Готовые методы для базовой работы с изображениями
    #39550373
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Pavel__1. Не нравится, не читайте! Кодирую не на заказ, мне норм.
Можете делать, что хотите, но зачем тогда нам своё гавно показываете?

__Pavel__2. Что не так с освобождением ресурсов? Флаг нужен для того, чтобы НЕ убивать ресурс, если этого НЕ надо.
О ресурсах речь не идёт. Для тех кто в танке я специально подсветил.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Готовые методы для базовой работы с изображениями
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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