Реализовать ластик в графическом редакторе
Как сделать ластик в графическом редакторе
Доброго.. 🙂 Подскажите, пожалуйста, как же сделать инструмент "ластик" в графическом редакторе.
Графический редактор — реализовать масштаб и ластик
Кто подскажет как реализовать такие функции в графическом редакторе как: стирачка, увеличение.
геометрические фигуры в простом графическом редакторе
Здравствуйте. Пробую сделать простой графический редактор на C#. Не могу найти решение, по.

Алгоритм для заливки в графическом редакторе
Взялся за графический редактор и дошел до заливки. Совершенно не имею представления, как ее.
389 / 304 / 67
Регистрация: 10.07.2010
Сообщений: 802
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
bool temp = false; private void Form1_MouseDown(object sender, MouseEventArgs e) { temp = true; } private void Form1_MouseMove(object sender, MouseEventArgs e) { if (temp == true) { Graphics g = Graphics.FromHwnd(this.Handle); int size_of_lastic = 10; g.FillEllipse(new SolidBrush(this.BackColor), e.X - size_of_lastic / 2, e.Y - size_of_lastic / 2, size_of_lastic, size_of_lastic); } } private void Form1_MouseUp(object sender, MouseEventArgs e) { temp = false; }
Регистрация: 12.03.2011
Сообщений: 145
если зарисовывать кругом, то потом когда я по новой буду рисовать, не залитые фигуры, в местах етих кругов будут незарисовуемые пятна.
389 / 304 / 67
Регистрация: 10.07.2010
Сообщений: 802
вот лично я ничего не понял Скрин в студию, ну или на словах как то попонятней объясни, что бы даже самый тупой понял. было бы супер
Регистрация: 12.03.2011
Сообщений: 145
а не извините то мой затуп был, забыл переменую на фолс поставить, спс за помощь!-)
Регистрация: 25.02.2014
Сообщений: 120
подскажите пожалуйста как будет работать ваш код когда выделяешь прямоугольную область. нужно выделить область и удалить все что выделил,ну или закрасить белым цветом.
Вот выделение
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
//нажатие л.к. мыши(запоминает начальные координаты прямоугольная область) private void pictureBox1_MouseDown_1(object sender, MouseEventArgs e) { if (pictureBox1.Cursor == Cursors.Cross) { DrawRectangle = true; DrawRectangle_Mouse_X_Start = e.Location.X; DrawRectangle_Mouse_Y_Start = e.Location.Y; DrawRectangle_Mouse_X_End = e.Location.X + 1; DrawRectangle_Mouse_Y_End = e.Location.Y + 1; } if (pictureBox1.Cursor == Cursors.Hand) { m_PanStartPoint = new Point(e.X, e.Y); } } //Сдвиг мыши(+ конечные координаты) private void pictureBox1_MouseMove_1(object sender, MouseEventArgs e) { if (pictureBox1.Cursor == Cursors.Cross && e.Button == MouseButtons.Left) { DrawRectangle_Mouse_X_End = e.Location.X; DrawRectangle_Mouse_Y_End = e.Location.Y; pictureBox1.Refresh(); } if (pictureBox1.Cursor == Cursors.Hand && e.Button == MouseButtons.Left) { int DeltaX; int DeltaY; DeltaX = (m_PanStartPoint.X - e.X); DeltaY = (m_PanStartPoint.Y - e.Y); tabPage1.AutoScrollPosition = new System.Drawing.Point((DeltaX - tabPage1.AutoScrollPosition.X), (DeltaY - tabPage1.AutoScrollPosition.Y)); } } рисуем выделенный прямоугольник private void pictureBox1_Paint_1(object sender, PaintEventArgs e) { if (DrawRectangle) { int MouseX; int MouseY; MouseX = DrawRectangle_Mouse_X_End - DrawRectangle_Mouse_X_Start; MouseY = DrawRectangle_Mouse_Y_End - DrawRectangle_Mouse_Y_Start; //Up and Left if (MouseX 0 && MouseY 0) { rect = new Rectangle((new Point(DrawRectangle_Mouse_X_End, DrawRectangle_Mouse_Y_End)), new Size(System.Math.Abs(MouseX), System.Math.Abs(MouseY))); } //Down and Right if (MouseX > 0 && MouseY > 0) { rect = new Rectangle((new Point(DrawRectangle_Mouse_X_Start, DrawRectangle_Mouse_Y_Start)), new Size((MouseX), (MouseY))); } //Up and Right if (MouseX 0 && MouseY > 0) { rect = new Rectangle((new Point(DrawRectangle_Mouse_X_End, DrawRectangle_Mouse_Y_Start)), new Size(System.Math.Abs(MouseX), MouseY)); } //Down and Left if (MouseX > 0 && MouseY 0) { rect = new Rectangle((new Point(DrawRectangle_Mouse_X_Start, DrawRectangle_Mouse_Y_End)), new Size(MouseX, System.Math.Abs(MouseY))); } try { e.Graphics.DrawRectangle(Pens.Black , rect); } catch (Exception) { } } }
Ластик
Инструмент используется для удаления частей активного слоя или выделения. Это может быть полезно при работе с многослойными изображениями, поскольку удаленные части верхнего слоя позволяют показывать нижние слои.
Внимание! Стирание может привести к отображению рисунка шахматной доски. Этот шаблон используется для обозначения областей изображения, которые являются прозрачными — этот шаблон на самом деле не является частью изображения и не будет отображаться вне среды редактирования Paint.NET.

«Ластик» имеет настраеваемые параметры Ширины и Жесткости кисти на Панели инструментов.
Ширина
Ширина кисти определяет размер круга кончика «Ластика». Обратите внимание, что кончик «Ластика» всегда будет круглым — это невозможно изменить.

На примере ниже применено три ширины кисти. В верхней части Ширина кисти составляет 5 пикселей. В средней части Ширина кисти составляет 20 пикселей. В нижней части Ширина кисти составляет 65 пикселей.
Жесткость
Жесткость показывает, насколько жесткими или мягкими будут стертые края. Низкие значения дают более мягкий или более размытый край, в то время как высокие значения дают более жесткий или более четкий край.

На примере ниже показаны три настройки жесткости. В верхней части Жесткость составляет 10%. Обратите внимание на мягкий край. В средней части Жесткость составляет 50%. В нижней части Жесткость составляет 100%.
Внимание! Жесткость можно считать силой сглаживания, используемой для смягчения краев. По этой причине параметр жесткости игнорируется, если отключено сглаживание.
Установка альфа-канала
«Ластик» наследует значение альфа-канала Основного цвета при использовании левой кнопки мыши и значение альфа-канала Дополнительного цвета при использовании правой кнопки мыши. Это позволяет делать мягкие стирания.
На примере ниже представлены примеры трех настроек альфа-канала:

- В левой части значение альфа-канала установлено на 60. Непрозрачность стираемой области будет 255-60=195 и исходная информация о цвете будет сохранена.
- В средней части значение альфа-канала установлено на 120. Непрозрачность стираемой области будет 255-120=135. Опять же, исходная информация о цвете будет сохранена.
- В правой части значение альфа-канала установлено на 255 (максимум). Непрозрачность стираемой области будет 255-255=0. Исходная информация о цвете будет заменена белым (#FFFFFF).
Стирание частей изображения с помощью инструмента «Ластик»
Инструмент «Ластик» может сделать пиксели прозрачными или преобразовать их в цвет фона изображения.

![]()
Выберите инструмент «Ластик» (E) .
На панели «Параметры» можно настроить параметры инструмента, такие как Размер и Жесткость, чтобы получить желаемый результат.
Перетаскивайте инструмент над изображением, которое нужно стереть.
Графический редактор с карандашом и ластиком
Здравствуйте!
Нужно собрать графический редактор с карандашом и ластиком. Элементы я добавить смог, но не могу никак организовать работу карандаша и ластика (
Вроде пробовал организовать и с помощью PaintBox, но тоже ничего не вышло.
Может кто-нибудь помочь?
Прикрепляю архив с программой.
Граф. редактор.rar
Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
[Графический редактор] Как организовать рисование карандашом (кистью)?
Нужно реализовать Рисовать карандашом (кистью). Но я что то не пойму как это сделать.. Пример есть.
А можно в Inkscape работать ластиком как ластиком?
Я до сих пор не понимаю, тот ли странный прямоугольник я считаю ластиком. У меня привычка -.
Калькулятор, редактор списка строк, графический редактор
Помогите, кто чем может! Очень надо,хотя бы что то из этого сделать!
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
Вложения
| Paint.rar (610.5 Кб, 187 просмотров) |
Регистрация: 09.12.2014
Сообщений: 12
Вот вроде почти готово, но есть проблема.
Когда выбираешь допустим карандаш, то на поле он сразу рисует линии, даже если еще не нажал кнопку мыши. Так же и с ластиком. Как это исправить?
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 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
//--------------------------------------------------------------------------- #include #pragma hdrstop #include "Unit.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { // мерцание Form1->DoubleBuffered = true; } //--------------------------------------------------------------------------- void __fastcall TForm1::MOpenClick(TObject *Sender) { if (OpenPictureDialog1->Execute()) { Image3->Picture->LoadFromFile(OpenPictureDialog1->FileName); } } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { // заполнение выбранного цвета Image1->Canvas->FillRect(Rect(0,0,Image1->Width,Image1->Height)); // ширина палитры int HW = Image4->Width / 10; // закраска палитры for(int i = 1; i 10; i++) { switch (i) { case 1:Image4->Canvas->Brush->Color = clBlack; break; case 2:Image4->Canvas->Brush->Color = clAqua; break; case 3:Image4->Canvas->Brush->Color = clBlue; break; case 4:Image4->Canvas->Brush->Color = clFuchsia; break; case 5:Image4->Canvas->Brush->Color = clGreen; break; case 6:Image4->Canvas->Brush->Color = clLime; break; case 7:Image4->Canvas->Brush->Color = clMaroon; break; case 8:Image4->Canvas->Brush->Color = clRed; break; case 9:Image4->Canvas->Brush->Color = clYellow; break; case 10:Image4->Canvas->Brush->Color = clWhite; } Image4->Canvas->Rectangle((i-1)*HW,0,i*HW,Image4->Height); } // для холста Image3->Canvas->MoveTo(0,0); } //--------------------------------------------------------------------------- void __fastcall TForm1::Image3MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if((Sender == Image4)) { if(Button == mbLeft) { // основной цвет Image1->Canvas->Brush->Color = ((TImage *)Sender)->Canvas->Pixels[X][Y]; Image1->Canvas->FillRect(Rect(0,0,Image1->Width,Image1->Height)); } } else { if (SBPen->Down) { // карандаш Image3->Canvas->MoveTo(X,Y); Image3->Canvas->Pen->Color = Image1->Canvas->Brush->Color; } else if (SBErase->Down) { // ластик R = Rect(X-6,Y-6,X+6,Y+6); Image3->Canvas->DrawFocusRect(R); Image3->Canvas->Brush->Color=clWhite; Image3->Canvas->FillRect(Rect(X-5,Y-5,X+5,Y+5)); } } } //--------------------------------------------------------------------------- void __fastcall TForm1::UndoClick(TObject *Sender) { Image3->Picture->Assign(BitMap); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormDestroy(TObject *Sender) { BitMap->Free(); } //--------------------------------------------------------------------------- void __fastcall TForm1::SBBrushClick(TObject *Sender) { if (((TSpeedButton *)Sender)->Down) BitMap->Assign(Image3->Picture); } //--------------------------------------------------------------------------- void __fastcall TForm1::Image3MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { if (SBPen->Down) Image3->Canvas->LineTo(X,Y); else if (SBErase->Down) { // ластик Image3->Canvas->DrawFocusRect(R); R = Rect(X-6,Y-6,X+6,Y+6); Image3->Canvas->DrawFocusRect(R); Image3->Canvas->FillRect(Rect(X-5,Y-5,X+5,Y+5)); }} //--------------------------------------------------------------------------- void __fastcall TForm1::Image3MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) {if (SBErase->Down) Image3->Canvas->DrawFocusRect(R); } //--------------------------------------------------------------------------- void __fastcall TForm1::MSaveClick(TObject *Sender) { if (SavePictureDialog1->Execute()) { BitMap->Assign(Image3->Picture); BitMap->SaveToFile(SavePictureDialog1->FileName); } } //--------------------------------------------------------------------------- void __fastcall TForm1::N1Click(TObject *Sender) { Close(); } //---------------------------------------------------------------------------
случайный прохожий
2541 / 1689 / 562
Регистрация: 20.07.2013
Сообщений: 4,711
Скинь весь проект.
Регистрация: 09.12.2014
Сообщений: 12
Вот проект. Arantsev (графический редактор).rar
случайный прохожий
2541 / 1689 / 562
Регистрация: 20.07.2013
Сообщений: 4,711

Сообщение было отмечено Han_Koh как решение
Решение
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 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
//--------------------------------------------------------------------------- #include #pragma hdrstop #include "Unit.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { // мерцание Form1->DoubleBuffered = true; } //--------------------------------------------------------------------------- void __fastcall TForm1::MOpenClick(TObject *Sender) { if (OpenPictureDialog1->Execute()) { Image3->Picture->LoadFromFile(OpenPictureDialog1->FileName); } } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { // заполнение выбранного цвета Image1->Canvas->FillRect(Rect(0,0,Image1->Width,Image1->Height)); // ширина палитры int HW = Image2->Width / 10; // закраска палитры for(int i = 1; i 10; i++) { switch (i) { case 1:Image2->Canvas->Brush->Color = clBlack; break; case 2:Image2->Canvas->Brush->Color = clAqua; break; case 3:Image2->Canvas->Brush->Color = clBlue; break; case 4:Image2->Canvas->Brush->Color = clFuchsia; break; case 5:Image2->Canvas->Brush->Color = clGreen; break; case 6:Image2->Canvas->Brush->Color = clLime; break; case 7:Image2->Canvas->Brush->Color = clMaroon; break; case 8:Image2->Canvas->Brush->Color = clRed; break; case 9:Image2->Canvas->Brush->Color = clYellow; break; case 10:Image2->Canvas->Brush->Color = clWhite; } Image2->Canvas->Rectangle((i-1)*HW,0,i*HW,Image2->Height); } // для холста Image3->Canvas->MoveTo(0,0); } //--------------------------------------------------------------------------- void __fastcall TForm1::Image3MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if(Button == mbLeft) Tag = 1; // если нажата левая кнопка мыши, то включаем режим рисования if((Sender == Image2)) { if(Button == mbLeft) { Tag = 0; // после смены цвета отключаем режим рисования // основной цвет Image1->Canvas->Brush->Color = ((TImage *)Sender)->Canvas->Pixels[X][Y]; Image1->Canvas->FillRect(Rect(0,0,Image1->Width,Image1->Height)); }} else { if (SBPen->Down) { // карандаш Image3->Canvas->MoveTo(X,Y); Image3->Canvas->Pen->Color = Image1->Canvas->Brush->Color; } else if (SBErase->Down) { // ластик R = Rect(X-6,Y-6,X+6,Y+6); Image3->Canvas->DrawFocusRect(R); Image3->Canvas->Brush->Color=clWhite; Image3->Canvas->FillRect(Rect(X-5,Y-5,X+5,Y+5)); } } } //--------------------------------------------------------------------------- void __fastcall TForm1::UndoClick(TObject *Sender) { Image3->Picture->Assign(BitMap); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormDestroy(TObject *Sender) { BitMap->Free(); } //--------------------------------------------------------------------------- void __fastcall TForm1::SBBrushClick(TObject *Sender) { if (((TSpeedButton *)Sender)->Down) BitMap->Assign(Image3->Picture); } //--------------------------------------------------------------------------- void __fastcall TForm1::Image3MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { if (Tag == 1) // если режим рисования включен { if (SBPen->Down) Image3->Canvas->LineTo(X,Y); else if (SBErase->Down) { // ластик Image3->Canvas->DrawFocusRect(R); R = Rect(X-6,Y-6,X+6,Y+6); Image3->Canvas->DrawFocusRect(R); Image3->Canvas->FillRect(Rect(X-5,Y-5,X+5,Y+5)); } } } //--------------------------------------------------------------------------- void __fastcall TForm1::Image3MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) {if (SBErase->Down) Image3->Canvas->DrawFocusRect(R); Tag = 0; // отключаем режим рисования } //--------------------------------------------------------------------------- void __fastcall TForm1::MSaveClick(TObject *Sender) { if (SavePictureDialog1->Execute()) { BitMap->Assign(Image3->Picture); BitMap->SaveToFile(SavePictureDialog1->FileName); } } //--------------------------------------------------------------------------- void __fastcall TForm1::N1Click(TObject *Sender) { Close(); } //---------------------------------------------------------------------------
