Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 25.01.2017
Сообщений: 53
1

Проблема с рисованием на PictureBox с увеличением

18.10.2018, 16:26. Просмотров 1892. Ответов 21


Делаю графический редактор на подобии Paint.net ломаю голову не 1 ин год уже и вот надеюсь получю помощь!
Суть моей проги пока токова
1) открытие картинки
2)Рисование
3)Маштабирование
вроди все просто и код оставлю внизу
но проблемма состоит в том что при увеличении кординаты e.mouseeventargs скорее всего меняются и рисуется не там где надо воще смещается все хмм ломаю голову перепробывал много вариантов

код таков:

vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
   Dim g As System.Drawing.Graphics
    Dim paintmode As Boolean = False
    
 
 Private Sub Picturebox1_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Picturebox1_ UC1.MouseMove
        If paintmode = True Then
            g = System.Drawing.Graphics.FromImage(picturebox1.Image)
            g.DrawImage("какая то картинка не важно это текстура мыши", e.X , e.Y )
            Picturebox1.Refresh()
 
        End If
    End Sub
 
    Private SubPicturebox1_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Picturebox1.MouseUp
        paintmode = False
 
    End Sub
 
    Private Sub Picturebox1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Picturebox1.MouseDown
        paintmode = True
 
 
 
    End Sub


Довольно таки простой код и при увеличении :

vb.net
1
2
3
4
Private Sub  Picturebox1_MouseWheel(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles  Picturebox1.MouseWheel
if e.delta>0 then picturebox1.size = new point(picturebox1.size.width + 50,picturebox1.size.height + 50)
if e.delta<0 then picturebox1.size = new point(picturebox1.size.width - 50,picturebox1.size.height - 50)
    End Sub
Код щас просто написал не важно не обращате на него внимания просто скажите от чего смещается? из за изменения размера picturebox кординаты e.mouseeventargs наверно незнаю помогите
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.10.2018, 16:26
Ответы с готовыми решениями:

Очистка PictureBox перед рисованием очередной фигуры
Подскажите, пожалуйста, как сделать так, чтобы при рисовании одной фигуры, прежняя стиралась ( не...

Проблема с рисованием
Почему то на форме нет рисунка. Подскажите что не так. using System; using...

Проблема с рисованием.
Здравствуйте. Немного предыстории: пару недель назад я решил начать изучать с#, чтобы можно было...

Проблема с рисованием графа в Image
Здравствуйте, возникла проблема с рисованием графа. Я хотел написать программа, которая рисует...

21
986 / 844 / 201
Регистрация: 29.09.2015
Сообщений: 980
18.10.2018, 21:29 2
Нужно понять простую вещь, что масштабируется контрол, но не поверхность рисования. Это значит, что координаты на поверхности отмасштабированного контрола не будут соответствовать координатам передаваемые интерфейсу рисованию (Graphics) по поверхности. Вот вам и причина. Проблему можно решить конвертированием передаваемых координат относительно масштаба.
Начнем с того, что контрол PictureBox должен иметь те же пропорции что и изображение. Так понимаю, изображение у вас просто растягивается по контролу.
Для конвертирования будем использовать соотношение одной стороны контрола и изображения
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Public _scale as Double 
 
'после присвоение картинки контролу нужно рассчитать текущий масштаб [_scale = ширина контрола / ширина изображения]
'ваш код присвоения ...
'далее при масштабировании при помощи колесика мыши перерасчитывать соотношение
 
Private Sub Picturebox1_MouseWheel(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Picturebox1.MouseWheel
if e.delta>0 then Picturebox1.size = new point(picturebox1.size.width + 50,picturebox1.size.height + 50)
if e.delta<0 then picturebox1.size = new point(picturebox1.size.width - 50,picturebox1.size.height - 50)
 
_scale = Picturebox1.Width / Picturebox1.Image.Width
 End Sub
 
Private Sub Picturebox1_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Picturebox1.MouseMove
        If paintmode = True Then
            g = System.Drawing.Graphics.FromImage(picturebox1.Image)
            g.DrawImage("какая то картинка не важно это текстура мыши", e.X * _scale , e.Y * _scale)
            Picturebox1.Refresh()
 
        End If
End Sub
 
'остальной ваш код ...
Учтите, я только разбирал проблемы масштаба и то есть упущения, но у вас с рисованием перемещаемого изображения будут проблемы, оно будет отсекаться пари выходе из края поверхности, и та часть которая предполагается должна быть пустой будет закрашена изображением предыдущего положения.
2
0 / 0 / 0
Регистрация: 25.01.2017
Сообщений: 53
18.10.2018, 23:03  [ТС] 3
ХМмм ругается
0
Миниатюры
Проблема с рисованием на PictureBox с увеличением  
986 / 844 / 201
Регистрация: 29.09.2015
Сообщений: 980
18.10.2018, 23:05 4
vb.net
1
CInt(e.X * _scale)
0
0 / 0 / 0
Регистрация: 25.01.2017
Сообщений: 53
18.10.2018, 23:18  [ТС] 5
Вот быстро набросал все все равно отходит и переделал твой код немного а то ругается с исходником легче будет тебе понять
0
Вложения
Тип файла: rar Test.rar (61.5 Кб, 24 просмотров)
0 / 0 / 0
Регистрация: 25.01.2017
Сообщений: 53
18.10.2018, 23:22  [ТС] 6
Вот на для текстурки
0
Изображения
 
0 / 0 / 0
Регистрация: 25.01.2017
Сообщений: 53
18.10.2018, 23:44  [ТС] 7
хмм ты прав может дело в pictuebox1 image , маштабируется picturebox И меняются кординаты а picturebox1.image остается может как то можно и их поменять или я не то говорю

Добавлено через 6 минут
Хмм а если удолять и создовать сам picturebox1 заного при маштабирование все же норм будет!
удалить и создать такой же но больше тогда ниче не смещается

Добавлено через 3 минуты
нет так тоже не выйдет нужно как то что то делать с кординатами image ты был прав picturebox должен быть как Image но при маштабирование кординаты Image не меняюься! я плачю че делать
0
Sklifosofsky
19.10.2018, 00:13
  #8

Не по теме:

Завтра. Сплю уже

0
_Radik_
19.10.2018, 07:28
  #9

Не по теме:

Цитата Сообщение от droman1 Посмотреть сообщение
Делаю графический редактор на подобии Paint.net ломаю голову не 1 ин год уже и вот надеюсь получю помощь!
Суть моей проги пока токова
1) открытие картинки
2)Рисование
3)Маштабирование
унёс в личную коллекция перлов

0
1241 / 950 / 133
Регистрация: 01.10.2009
Сообщений: 2,902
Записей в блоге: 1
19.10.2018, 07:40 10
_Radik_,

Не по теме:

+

0
3612 / 2929 / 705
Регистрация: 02.02.2013
Сообщений: 2,815
Записей в блоге: 2
19.10.2018, 19:58 11
Не очень понял, в чем собственно проблема. Поэтому ограничусь общими рассуждениями.
GDI+ использует три координатных пространства: мировое, страницы и устройства. От этого и нужно отталкиваться.
Мировые координаты – это координаты вашей задачи. Именно они используются в процедурах рисования (все преобразования между координатными системами выполняются автоматически).
Страничные координаты - это координаты, используемые при рисовании на форме, элементе управления (PictureBox, Panel).
Координаты устройства — координаты, используемые физическим устройством.
Прикладываю небольшую программку иллюстрирующую, как меняются координаты листа при сдвиге и изменении масштаба. Сдвиг и масштаб реализованы через кнопку, чтобы лишним кодом не закрывать главное.
1
Миниатюры
Проблема с рисованием на PictureBox с увеличением  
Вложения
Тип файла: rar PBCoords.rar (12.6 Кб, 24 просмотров)
0 / 0 / 0
Регистрация: 25.01.2017
Сообщений: 53
19.10.2018, 22:30  [ТС] 12
Да кто ты такой да это реально круто Спасибо огромное

Добавлено через 6 минут
Только исходник не хочет работать что то можешь еще раз прислать

Добавлено через 4 минуты
то что надо нужны мировые кординаты но как это все сделать

Добавлено через 6 минут
как высчитывать мировые кординаты
0
3612 / 2929 / 705
Регистрация: 02.02.2013
Сообщений: 2,815
Записей в блоге: 2
19.10.2018, 23:25 13
Цитата Сообщение от droman1 Посмотреть сообщение
Только исходник не хочет работать
Код самый обычный и должен работать (VS2010, Net 4.0).
Цитата Сообщение от droman1 Посмотреть сообщение
как высчитывать мировые кординаты
Пересчет координат выполняется с помощью Graphics.TransformPoints (https://docs.microsoft.com/ru-... work-4.7.2)
0
0 / 0 / 0
Регистрация: 25.01.2017
Сообщений: 53
20.10.2018, 00:26  [ТС] 14
У тебя есть VK?

Добавлено через 28 минут
Хмм сложно разобратся помоги плизз
0
0 / 0 / 0
Регистрация: 25.01.2017
Сообщений: 53
20.10.2018, 00:34  [ТС] 15
И исходник ругается можешь как то помочь
0
Миниатюры
Проблема с рисованием на PictureBox с увеличением  
0 / 0 / 0
Регистрация: 25.01.2017
Сообщений: 53
20.10.2018, 00:36  [ТС] 16
У меня VS 2008
0
3612 / 2929 / 705
Регистрация: 02.02.2013
Сообщений: 2,815
Записей в блоге: 2
20.10.2018, 13:05 17
Попробуйте (Net 2.0)
0
Вложения
Тип файла: rar PBCoordsNet2.rar (13.4 Кб, 17 просмотров)
0 / 0 / 0
Регистрация: 25.01.2017
Сообщений: 53
20.10.2018, 23:22  [ТС] 18
Говорит сделанно в Версии новее! нужен еще старее исходник ххаха

Добавлено через 6 часов 41 минуту
https://habr.com/post/319606/
вот глянь какой вывод сделать
0
3612 / 2929 / 705
Регистрация: 02.02.2013
Сообщений: 2,815
Записей в блоге: 2
27.10.2018, 14:44 19
Как понимаю сдвигов нет, поэтому продолжу. М.б. хоть кому-то будет интересно.
Сразу нужно уяснить что при рисовании вы всегда пользуетесь координатами Word (координатами вашей задачи). Все переходы W->P->D выполняются автоматически.
Расширю приведенный выше пример. Рисуем линию {(0,0)-(500,500)}. Сдвигаем и масштабируем. Выполняем клик мышью на одном из концов линии. Полученные P-координаты преобразуем в W-координаты. Рисуем квадраты по значениям этих координат. Результаты показаны на рисунках, ну а выводы делать вам.
Кликните здесь для просмотра всего текста
vb.net
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
Public Class Form1
'…
Private tp As Point
Private tpp() As Point
Private isDown As Boolean
Private Sub PictureBox1_Paint(sender As System.Object, e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
'…
    If isDown Then
        'переводим координаты Page (полученные в MouseDown) в координаты Word
        g.TransformPoints(Drawing2D.CoordinateSpace.World, Drawing2D.CoordinateSpace.Page, tpp)
        'рисуем квадрат по координатам Page (левый верхний угол)
        g.FillRectangle(Brushes.Red, tp.X, tp.Y, 20, 20)
        'рисуем квадрат по координатам Word (левый верхний угол)
        g.FillRectangle(Brushes.Green, tpp(0).X, tpp(0).Y, 20, 20)
        MsgBox("Page: " & tp.X & ", " & tp.Y & vbCrLf & "Word: " & tpp(0).X & ", " & tpp(0).Y)
    End If
End Sub
Private Sub PictureBox1_MouseDown(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
    tp = New Point(e.X, e.Y)
    tpp = {tp}
    isDown = True
    PictureBox1.Invalidate()
End Sub
Private Sub PictureBox1_MouseUp(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp
    isDown = False
End Sub
End Class

Аналогично для растра. Привожу код полностью.
Кликните здесь для просмотра всего текста
vb.net
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
Public Class Form3
    Private isDown As Boolean
    Private img As Bitmap
    Private tp As Point
    Private Sub Form3_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        img = Image.FromFile("808.jpg")
    End Sub
    Private Sub Scale_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
        PictureBox1.Invalidate()
    End Sub
    Private Sub Move_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
        PictureBox1.Invalidate()
    End Sub
    Private Sub PictureBox1_Paint(sender As System.Object, e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
        Dim g As Graphics = e.Graphics
        g.Clear(PictureBox1.BackColor)
        g.TranslateTransform(CInt(TextBox6.Text), CInt(TextBox5.Text))
        g.ScaleTransform(CSng(TextBox4.Text), CSng(TextBox4.Text))
        g.DrawImage(img, New Point(0, 0))
        If isDown Then
            Dim tpp() As Point = {tp}
            'переводим координаты Page (полученные в MouseDown) в координаты Word
            g.TransformPoints(Drawing2D.CoordinateSpace.World, Drawing2D.CoordinateSpace.Page, tpp)
            'рисуем квадрат по координатам Word (левый верхний угол)
            g.FillRectangle(Brushes.Green, tpp(0).X, tpp(0).Y, 10, 10)
            TextBox7.Text = tp.X.ToString
            TextBox8.Text = tp.Y.ToString
            TextBox1.Text = tpp(0).X.ToString
            TextBox2.Text = tpp(0).Y.ToString
        End If
    End Sub
    Private Sub PictureBox1_MouseDown(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
        tp = New Point(e.X, e.Y)
        isDown = True
        PictureBox1.Invalidate()
    End Sub
    Private Sub PictureBox1_MouseUp(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp
        isDown = False
    End Sub
End Class

PS. Если при работе с графикой WinForm не устраивает радикально, стоит обратиться к WPF (Windows Presentation Foundation).
2
Миниатюры
Проблема с рисованием на PictureBox с увеличением   Проблема с рисованием на PictureBox с увеличением   Проблема с рисованием на PictureBox с увеличением  

0 / 0 / 0
Регистрация: 25.01.2017
Сообщений: 53
22.03.2019, 23:48  [ТС] 20
НЕПОМОГАЕТ ПРОШУ ПОМОГИ ИСХОДНИКОМ

Добавлено через 1 час 39 минут
Как преобразовать кординаты картинки picturebox в кординаты мировые или кординаты формы! при рисовании и увеличении не точность идет убегает курсор и тд и тп как преобразовать кординаты формула или еще что помогите!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.03.2019, 23:48

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Проблема с рисованием прозрачных текстур в OpenGL
Сначала объявил все параметры: glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); ...

Проблема с рисованием и дочерними окнами (кнопками и полями редактирования)
Здравствуйте , товарищи! Нужна помощь в организации правильной отрисовки окна. Проблема , скорее...

Проблема с увеличением памяти
У меня ноутбук Toshba satelite L500. Оперативная память 2 слота по 2GB, по данным можно увеличить...

Проблема с увеличением места на жестком диске
Проблема в том, что я не могу добавить место к диску С (от диска D), в чем может быть проблема не...

Проблема с PictureBox
Всем привет! У меня проблема такова: Нужно осуществить загрузку картинок из папки с определенным...

Проблема с picturebox
Привет,у меня проблема с picture box.В конструкторе картинка отображается нормально, а после...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.