Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/34: Рейтинг темы: голосов - 34, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 23.11.2010
Сообщений: 3

Zoom изображения

02.03.2011, 01:03. Показов 6406. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите, пожалуйста, метод или пример , как по-нормальному масштабировать изображение ,что-бы увеличивалось или же уменьшалось по отношении положения курсора на картинке.
Сейчас масштабирую с помощью изменения размеров pictureBox , а картинку просто растягиваю в самом контейнере.

Учить С# да и вообще программирование только начал , и что-то красивое сделать не получается.
Вот пример кода зума(к стати идею брал с этого же форума) ,естественно правильно он не работает , да и долго я не старался, т.к считаю ,что подход не верный.
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
//Zoom
        private void Form1_MouseWheel(object sender, MouseEventArgs e)
        {
            if (mouseInPanel)
            {
                Size pSize = pictureBox1.Size;
                //Size size;
                const double delta = 1.1;
                int deltaSizeX, deltaSizeY;
                if (e.Delta > 0)
                {
                    //size = new Size((int)(pSize.Width * delta), (int)(pSize.Height * delta));
 
                    deltaSizeX = (int)(pSize.Width * delta) - (int)(pSize.Width);
                    deltaSizeY = (int)(pSize.Height * delta) - (int)(pSize.Height);
                    pictureBox1.Bounds = new Rectangle((int)(deltaSizeX - Cursor.Position.X ), (int)(deltaSizeY - Cursor.Position.Y ), (int)(pSize.Width * delta), (int)(pSize.Height * delta));   
                }
                else
                {
                    // size = new Size((int)(pSize.Width * delta), (int)(pSize.Height * delta));
 
                    deltaSizeX = (int)(pSize.Width / delta) - (int)(pSize.Width);
                    deltaSizeY = (int)(pSize.Height / delta) - (int)(pSize.Height);
                    pictureBox1.Bounds = new Rectangle((int)(deltaSizeX - Cursor.Position.X ), (int)(deltaSizeY - Cursor.Position.Y ), (int)(pSize.Width / delta), (int)(pSize.Height / delta));
                    
                }
                //if (size.Width >= 50 && size.Height >= 50)
               // {
                    //pictureBox1.Size = size;
                    //newArea = (size.Width * size.Height);
                    imgArea = (pictureBox1.Image.Size.Width*pictureBox1.Image.Size.Height);    
              //  }
 
                label4.Text = "Zoom : " + ((100 + ((newArea / imgArea * 100) - 100))).ToString() + " %";
                label5.Text = "Original size : " + pictureBox1.Image.Size;
                label6.Text = "Size : " + pictureBox1.Size;
            }
 
            
        }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.03.2011, 01:03
Ответы с готовыми решениями:

WebBrowser zoom css
Привет всем, перерыл уже все что мог, но так и не получилось уменьшить страницу с помощью css zoom'a. Суть: нужно сделать уменьшение...

Возможные решения для Zoom&Rotate картинки в ASP.NET приложении
Замечание: пока я даже не знаю - решаема ли такая задача в принципе. У меня есть ASP.NET WebForms приложение. Клиенты на которых оно...

Zoom рисунка
Код следующий: <Viewbox Name="ss2" Margin="0,52,94,0" Stretch="Uniform"> <Canvas Height="100" Margin="224,0,316,92.5"...

4
 Аватар для DeKaN
36 / 36 / 8
Регистрация: 10.02.2010
Сообщений: 184
02.03.2011, 02:45
Чтобы увеличить изображение относительно курсора, то просто нужно вырезать кусок прямоугольной формы из исходного ихображения, с центром - координаты мыши. Т.е
C#
1
2
3
4
5
6
Bitmap B = new Bitmap(pictureBox1.Size);
Graphics g = Graphics.FromImage(B);
Rectangle R1 = new Rectangle(0, 0, B.Width, B.Height);
Rectangle R2 = new Rectangle(C.X - width/2, C.Y - height/2, width, height);
g.DrawImage(image, R1, R2, GraphicsUnit.Pixel);
pictureBox1.Image = B;
Где:
  • image - исходное изображение
  • С - координаты мыши (в пикселях на изображении) - это не координаты на форме
  • width,height - размер нужного изображения (т.е. размер выводимой области изображения image)
Впринципе всё, с остальным я думаю разберёшься. Если что, спрашивай
1
0 / 0 / 0
Регистрация: 23.11.2010
Сообщений: 3
02.03.2011, 14:25  [ТС]
Спасибо за совет!

А как мне получать координаты мыши на изображении?

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

И к стати,а можно ли это сделать с той стороны ,которой у меня было -увеличивая picturebox,проблема в том то ,что я застопорился на моменте обсчёта координат верхнего левого угла , у меня просто Бокс еще и двигается с помощью мышки и идея была аля как в Пикаске ?
0
 Аватар для DeKaN
36 / 36 / 8
Регистрация: 10.02.2010
Сообщений: 184
02.03.2011, 15:19
Скажи что тебе необходимо сделать в конце??? опиши проблему....Если просмоторщик типа пикасы, то сделать подобным образом не получится (вернее будет не красиво)...почитай про DirectX или OpenGL...Если нужно увеличить пикчервокс, то тут нужна математика. т.е. у тебя есть координата мыши, размер пикчербокса до увеличения, и после... Подсчитываем на сколько пикселей сместилась наша точка (под курсором), и двигаем на это количество влево и вверх (ну или вниз, вправо....по обстоятельствам) пикчербокс.
0
0 / 0 / 0
Регистрация: 23.11.2010
Сообщений: 3
02.03.2011, 15:40  [ТС]
Цитата Сообщение от DeKaN Посмотреть сообщение
Скажи что тебе необходимо сделать в конце??? опиши проблему....Если просмоторщик типа пикасы, то сделать подобным образом не получится (вернее будет не красиво)...почитай про DirectX или OpenGL...Если нужно увеличить пикчервокс, то тут нужна математика. т.е. у тебя есть координата мыши, размер пикчербокса до увеличения, и после... Подсчитываем на сколько пикселей сместилась наша точка (под курсором), и двигаем на это количество влево и вверх (ну или вниз, вправо....по обстоятельствам) пикчербокс.
я понял , ну собственно я так и делал , понял что не красиво.)

А проблема все-таки осталась , каскадом налаживается картинка на картинку и ценрт зума , уходит в некуда. Вот может я не правильно что-то сделал :
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
void pictureBox1_MouseWheel(object sender, MouseEventArgs e)
        {
            if (mouseInPanel)
            {
                Size pSize = pictureBox1.Size;
                //Size size;
                const double delta = 1.1;
                int deltaSizeX, deltaSizeY;
                if (e.Delta > 0)
                {
                    //size = new Size((int)(pSize.Width * delta), (int)(pSize.Height * delta));
 
                    // deltaSizeX = (int)(pSize.Width * delta) - (int)(pSize.Width);
                    //  deltaSizeY = (int)(pSize.Height * delta) - (int)(pSize.Height);
                    // pictureBox1.Bounds = new Rectangle((int)(deltaSizeX - Cursor.Position.X ), (int)(deltaSizeY - Cursor.Position.Y ), (int)(pSize.Width * delta), (int)(pSize.Height * delta));   
                    Bitmap B = new Bitmap(pictureBox1.Image);
                    Graphics g = Graphics.FromImage(B);
                    int width = (int)(B.Width * delta);
                    int height = (int)(B.Height * delta);
                    Rectangle R1 = new Rectangle(0, 0, B.Width, B.Height);
                    Rectangle R2 = new Rectangle(e.X - width / 2, e.Y - height / 2, width, height);
                    g.DrawImage(pictureBox1.Image, R1, R2, GraphicsUnit.Pixel);       
                    pictureBox1.Image = B;
                    pictureBox1.Refresh();
                    pictureBox1.Update();
                }
                else
                {
                    // size = new Size((int)(pSize.Width * delta), (int)(pSize.Height * delta));
 
                    //deltaSizeX = (int)(pSize.Width / delta) - (int)(pSize.Width);
                    // deltaSizeY = (int)(pSize.Height / delta) - (int)(pSize.Height);
                    // pictureBox1.Bounds = new Rectangle((int)(deltaSizeX - Cursor.Position.X ), (int)(deltaSizeY - Cursor.Position.Y ), (int)(pSize.Width / delta), (int)(pSize.Height / delta));
                    Bitmap B = new Bitmap(pictureBox1.Image);
                    Graphics g = Graphics.FromImage(B);
                    int width = (int)(B.Width / delta);
                    int height = (int)(B.Height / delta);
                    Rectangle R1 = new Rectangle(0, 0, B.Width, B.Height);
                    Rectangle R2 = new Rectangle(e.X - width / 2, e.Y - height / 2, width, height);
                    g.DrawImage(pictureBox1.Image, R1, R2, GraphicsUnit.Pixel);
                    pictureBox1.Update();
                    pictureBox1.Image = B;
 
                }
                //if (size.Width >= 50 && size.Height >= 50)
                // {
                //pictureBox1.Size = size;
                //newArea = (size.Width * size.Height);
                imgArea = (pictureBox1.Image.Size.Width * pictureBox1.Image.Size.Height);
                //  }
 
                label4.Text = "Zoom : " + ((100 + ((newArea / imgArea * 100) - 100))).ToString() + " %";
                label5.Text = "Original size : " + pictureBox1.Image.Size;
                label6.Text = "Size : " + pictureBox1.Size;
            }
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.03.2011, 15:40
Помогаю со студенческими работами здесь

Программа-просмотрщик (Zoom)
Здравствуйте. Имеется программа-просмотрщик на C# (пример в приложении). Там было всё просто: берём прямоугольную часть исходного...

Ищу примеры zoom
Подскажите как сделать увеличение колесикам и перемещение изображения путем зажатия левой кнопки

Zedgraph Zoom
Помогите исправить ошибку вызываю обработчик события на колесико мыши после функции DrawGraph private void Form1_MouseWheel(object...

Имя класса, функционирующего аналогично автокадовскому Zoom Window ?
Zoom Window работает так: на рисунке выбираю прямоугольник, который затем автоматически увеличивается во весь экран вместе с рисунком в...

Наложение изображения поверх другого изображения
Дорогие форумчане!Подскажите пожалуйста, как реализовать следующую задачу: необходимо наложить одно изображение поверх другого...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru