Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
1 / 1 / 0
Регистрация: 07.05.2015
Сообщений: 14

Как выяснить, какое именно изображение загружено в picturebox из ресуров

03.09.2015, 19:17. Показов 3989. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.

Есть 1 кнопка, 1 picturebox и 3 изображения в менеджере ресурсов (pic1, pic2, pic3).
По нажатию на кнопку одно из изображений устанавливается в picturebox.image случайным образом.

Как определить, какое именно из 3х изображений было установлено в picturebox?
(попытка if (picturebox.Image == MyProg1.Properties.Resources.pic1) - ни к чему не привела)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.09.2015, 19:17
Ответы с готовыми решениями:

Определить, какое изображение загружено в PictureBox
Здравствуйте! Нужно чтобы, если в PictureBox1 загружено изображение Image1.png, то в PictureBox2 и в PictureBox3 загружались Image2.png и...

Как определить какое именно изображение было выбрано на ScrollView
Если кому известно, подскажите пожалуйста, как мне определить какое именно изображение выбрано на ScrollView. Там есть массив картинок,...

Как проверить - загружено ли изображение в Image
как сделать, чтобы при нажатие на кнопку , если изображение не загружено на image1 выводилось showmessage не загруженно. и еще как...

11
127 / 121 / 68
Регистрация: 27.08.2015
Сообщений: 232
03.09.2015, 20:54
Andreys51, загляните в файл Resources.Designer.cs. Там есть такие строки в случае загрузки изображения:
C#
1
2
3
4
5
6
        internal static System.Drawing.Bitmap Image1 {
            get {
                object obj = ResourceManager.GetObject("Image1", resourceCulture);
                return ((System.Drawing.Bitmap)(obj));
            }
        }
ResourceManager.GetObject() не обязательно возвращает тот же объект, который формировался в первый раз. Он может быть таким же, а может быть сгенерированным заново:
If you call the GetObject method multiple times with the same name parameter, do not depend on the method returning a reference to the same object with each call. This is because the GetObject method can return a reference to an existing resource object in a cache, or it can reload the resource and return a reference to a new resource object.
В вашем случае - это как раз конструирование много разных объектов (различные ссылки) для одного и того же изображения в ресурсах.
Тривиальный казалось бы код
C#
1
2
3
4
5
            // Здесь ResourceManager конструирует один объект...
            pictureBox1.Image = Properties.Resources.Image1;
 
            // А здесь совершенно другой, для одного и того же изображения из ресурсов.
            MessageBox.Show((pictureBox1.Image == Properties.Resources.Image1).ToString());
в подавляющем большинстве случаев (по крайней мере, у меня так) будет выводить false!

Так что в вашей задаче нужно загружать изображение из ресурсов и тут же сохранять его в какой-то свой массив, с элементами которого потом будете проводить сравнение. Повторюсь, повторный запрос из ресурсов будет приводить к созданию новых объектов (с тем же самым бинарным изображением).
0
 Аватар для xGLUCk
1 / 1 / 1
Регистрация: 03.07.2015
Сообщений: 16
04.09.2015, 00:46
Рубрика "Вредные советы".
Сравнение каждого писеля двух изображений:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        private bool CompareImg (Bitmap pic1, Bitmap pic2)
        {
            int height = pic1.Height > pic2.Height ? pic1.Height : pic2.Height;
            int width = pic1.Width > pic2.Width ? pic1.Width : pic2.Width;
 
            for (int i = 0; i < width; i++)
            {
                for (int j = 0; j < height; j++)
                {
                    if (pic1.GetPixel(i, j) != pic2.GetPixel(i, j))
                    {
                        return false;
                    }
                }
            }
            return true;
        }
Добавлено через 5 минут
Вот нашел Темку. Там получше код
0
1 / 1 / 0
Регистрация: 07.05.2015
Сообщений: 14
04.09.2015, 01:06  [ТС]
Спасибо, конечно. Но хотелось бы что то более простое/менее громоздкое чем создание дополнительного массива для хранения требуемых переменных с последующим ковырянием в нём (и тем более попиксельное сравнение).

Неужто нет более изящного способа?
0
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
04.09.2015, 01:54
Ну если ты назначаешь картинку, то почему не можешь узнать какую именно?
1
1 / 1 / 0
Регистрация: 07.05.2015
Сообщений: 14
04.09.2015, 10:28  [ТС]
ViterAlex, хотелось бы узнать, но как?

Допустим я сменил картинку 3 раза и имею явный код в разных местах:
C#
1
2
3
picturebox.Image = MyProg1.Properties.Resources.pic1;
picturebox.Image = MyProg1.Properties.Resources.pic2;
picturebox.Image = MyProg1.Properties.Resources.pic3;
Логически я понимаю, что в какой то момент времени у меня в пикчебоксе находится pic3, но как программе это выяснить?
Я бы с удовольствием присвоил каждой картинке таги, но не знаю как это сделать для изображений.
Я бы с удовольствием ограничился только названием картинки в ресурсе, но опять же не знаю как это сделать ;(
(пока что я вижу один неоптимальный вариант - в момент явного назначения картинки присваивать некий номер некой переменной, и ввести словарь <номер_переменной, имя_картинки_в_ресурсах> - но такое нагромождение кода мне кажется несколько глупым для такого языка, и что то подсказывает, что должен быть более простой путь)
0
127 / 121 / 68
Регистрация: 27.08.2015
Сообщений: 232
04.09.2015, 12:16
Если использование тэгов является для вас вариантом, тогда так:
C#
1
2
3
4
            Image img = Properties.Resources.Image1;
            img.Tag = 1;
            pictureBox1.Image = img;
            MessageBox.Show(pictureBox1.Image.Tag.ToString());
0
1 / 1 / 0
Регистрация: 07.05.2015
Сообщений: 14
04.09.2015, 23:48  [ТС]
Moloch, спасибо.

Но это опять получился тот вариант что я привёл в скобках - каждому изображению присвоили номер (что хорошо) и что бы разобраться к чему он относится, нам придётся создавать массив всех изображений (что есть плохо, ибо изображения сами по себе уже и так находятся в ресурсах - вот там бы им присвоить таги, ну или каким то образом выяснить имя/код/какой либо идентификатор этой самой картинки, который будет одинаков как у ресурса, так и у picturebox.Image)
0
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
05.09.2015, 06:46
Цитата Сообщение от Andreys51 Посмотреть сообщение
должен быть более простой путь
Обращаться к ресурсу по имени
C#
1
(Image)Properties.Resources.ResourceManager.GetObject("ИмяРесурса")
0
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
05.09.2015, 08:24
(пока что я вижу один неоптимальный вариант - в момент явного назначения картинки присваивать некий номер некой переменной, и ввести словарь <номер_переменной, имя_картинки_в_ресурсах>
Andreys51, у тебя 40 изображений?) зачем словарь?
Создай публичную переменную a, если присваивается 1 изображение a=1, второе a=2...
Проверка if(a==1)..
1
1 / 1 / 0
Регистрация: 07.05.2015
Сообщений: 14
08.09.2015, 12:15  [ТС]
Рядовой, картинок не много, до 10 - но примерно столько же пикбоксов - итоговое количество комбинаций можешь посчитать... Без словаря или кучки дополнительных переменных, как ты предложил, не обойтись в твоём варианте..

ViterAlex - прости, не совсем понял твой ответ. У меня в ресурсах есть 3 картинки с именами pic1, pic2, pic3, и есть picturebox1.Image, в котором находится одна из этих картинок.

Напиши, пожалуйста, конкретную строку кода (в привязке к моим pic1-pic3 и picturebox1), которая позволит из picturebox1.Image узнать текущее "ИмяРесурса" (т.е. имена "pic1" или "pic2" или "pic3" или может какой то другой идентификатор, по которому их можно будет сопоставить)
(в идеале это что то типа простой строки if (picturebox1.Image == MyProg1.Properties.Resources.pic1) )
0
1 / 1 / 0
Регистрация: 07.05.2015
Сообщений: 14
13.09.2015, 08:13  [ТС]
Для тех кто будет искать подобное - вопрос не решён....
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.09.2015, 08:13
Помогаю со студенческими работами здесь

Как проверить, из какого файла загружено изображение?
Здравствуйте, проверяю правильность залитой картинки, то есть что бы в зависимости от того какая картинка залита в Image выполнялись разные...

Доступ к файлам ресуров(изображение, видео, аудио...) в jar
Как организовать доступ к оговоренным файлам, чтобы он работал после упаковки классов и данных в исполнимый архив? На практике: имею...

Как программно узнать, что изображение загружено в пикчуребокс?
Доброго всем времени суток! Вопрос в названии темы.

Проверка загружено ли изображение
Здравствуйте! Подскажите почему не работает код procedure TForm1.Image8Click(Sender: TObject); begin if...

Определить загружено ли в Image изображение
Подскажите, как сделать такое условие: if (в Image1 загружено изображение) then ShowMessage('В Image1 что-то есть');


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru