├── .gitattributes ├── .gitignore ├── ImNotGoodAtDrawingButTracing ├── ImNotGoodAtDrawingButTracing.sln └── ImNotGoodAtDrawingButTracing │ ├── App.config │ ├── Form1.Designer.cs │ ├── Form1.cs │ ├── Form1.resx │ ├── ImNotGoodAtDrawingButTracing.csproj │ ├── Program.cs │ ├── Properties │ ├── AssemblyInfo.cs │ ├── Resources.Designer.cs │ ├── Resources.resx │ ├── Settings.Designer.cs │ └── Settings.settings │ ├── pencil.ico │ └── pencil.png ├── LICENSE └── README.md /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | ## 4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore 5 | 6 | # User-specific files 7 | *.rsuser 8 | *.suo 9 | *.user 10 | *.userosscache 11 | *.sln.docstates 12 | 13 | # User-specific files (MonoDevelop/Xamarin Studio) 14 | *.userprefs 15 | 16 | # Mono auto generated files 17 | mono_crash.* 18 | 19 | # Build results 20 | [Dd]ebug/ 21 | [Dd]ebugPublic/ 22 | [Rr]elease/ 23 | [Rr]eleases/ 24 | x64/ 25 | x86/ 26 | [Ww][Ii][Nn]32/ 27 | [Aa][Rr][Mm]/ 28 | [Aa][Rr][Mm]64/ 29 | bld/ 30 | [Bb]in/ 31 | [Oo]bj/ 32 | [Ll]og/ 33 | [Ll]ogs/ 34 | 35 | # Visual Studio 2015/2017 cache/options directory 36 | .vs/ 37 | # Uncomment if you have tasks that create the project's static files in wwwroot 38 | #wwwroot/ 39 | 40 | # Visual Studio 2017 auto generated files 41 | Generated\ Files/ 42 | 43 | # MSTest test Results 44 | [Tt]est[Rr]esult*/ 45 | [Bb]uild[Ll]og.* 46 | 47 | # NUnit 48 | *.VisualState.xml 49 | TestResult.xml 50 | nunit-*.xml 51 | 52 | # Build Results of an ATL Project 53 | [Dd]ebugPS/ 54 | [Rr]eleasePS/ 55 | dlldata.c 56 | 57 | # Benchmark Results 58 | BenchmarkDotNet.Artifacts/ 59 | 60 | # .NET Core 61 | project.lock.json 62 | project.fragment.lock.json 63 | artifacts/ 64 | 65 | # ASP.NET Scaffolding 66 | ScaffoldingReadMe.txt 67 | 68 | # StyleCop 69 | StyleCopReport.xml 70 | 71 | # Files built by Visual Studio 72 | *_i.c 73 | *_p.c 74 | *_h.h 75 | *.ilk 76 | *.meta 77 | *.obj 78 | *.iobj 79 | *.pch 80 | *.pdb 81 | *.ipdb 82 | *.pgc 83 | *.pgd 84 | *.rsp 85 | *.sbr 86 | *.tlb 87 | *.tli 88 | *.tlh 89 | *.tmp 90 | *.tmp_proj 91 | *_wpftmp.csproj 92 | *.log 93 | *.tlog 94 | *.vspscc 95 | *.vssscc 96 | .builds 97 | *.pidb 98 | *.svclog 99 | *.scc 100 | 101 | # Chutzpah Test files 102 | _Chutzpah* 103 | 104 | # Visual C++ cache files 105 | ipch/ 106 | *.aps 107 | *.ncb 108 | *.opendb 109 | *.opensdf 110 | *.sdf 111 | *.cachefile 112 | *.VC.db 113 | *.VC.VC.opendb 114 | 115 | # Visual Studio profiler 116 | *.psess 117 | *.vsp 118 | *.vspx 119 | *.sap 120 | 121 | # Visual Studio Trace Files 122 | *.e2e 123 | 124 | # TFS 2012 Local Workspace 125 | $tf/ 126 | 127 | # Guidance Automation Toolkit 128 | *.gpState 129 | 130 | # ReSharper is a .NET coding add-in 131 | _ReSharper*/ 132 | *.[Rr]e[Ss]harper 133 | *.DotSettings.user 134 | 135 | # TeamCity is a build add-in 136 | _TeamCity* 137 | 138 | # DotCover is a Code Coverage Tool 139 | *.dotCover 140 | 141 | # AxoCover is a Code Coverage Tool 142 | .axoCover/* 143 | !.axoCover/settings.json 144 | 145 | # Coverlet is a free, cross platform Code Coverage Tool 146 | coverage*.json 147 | coverage*.xml 148 | coverage*.info 149 | 150 | # Visual Studio code coverage results 151 | *.coverage 152 | *.coveragexml 153 | 154 | # NCrunch 155 | _NCrunch_* 156 | .*crunch*.local.xml 157 | nCrunchTemp_* 158 | 159 | # MightyMoose 160 | *.mm.* 161 | AutoTest.Net/ 162 | 163 | # Web workbench (sass) 164 | .sass-cache/ 165 | 166 | # Installshield output folder 167 | [Ee]xpress/ 168 | 169 | # DocProject is a documentation generator add-in 170 | DocProject/buildhelp/ 171 | DocProject/Help/*.HxT 172 | DocProject/Help/*.HxC 173 | DocProject/Help/*.hhc 174 | DocProject/Help/*.hhk 175 | DocProject/Help/*.hhp 176 | DocProject/Help/Html2 177 | DocProject/Help/html 178 | 179 | # Click-Once directory 180 | publish/ 181 | 182 | # Publish Web Output 183 | *.[Pp]ublish.xml 184 | *.azurePubxml 185 | # Note: Comment the next line if you want to checkin your web deploy settings, 186 | # but database connection strings (with potential passwords) will be unencrypted 187 | *.pubxml 188 | *.publishproj 189 | 190 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 191 | # checkin your Azure Web App publish settings, but sensitive information contained 192 | # in these scripts will be unencrypted 193 | PublishScripts/ 194 | 195 | # NuGet Packages 196 | *.nupkg 197 | # NuGet Symbol Packages 198 | *.snupkg 199 | # The packages folder can be ignored because of Package Restore 200 | **/[Pp]ackages/* 201 | # except build/, which is used as an MSBuild target. 202 | !**/[Pp]ackages/build/ 203 | # Uncomment if necessary however generally it will be regenerated when needed 204 | #!**/[Pp]ackages/repositories.config 205 | # NuGet v3's project.json files produces more ignorable files 206 | *.nuget.props 207 | *.nuget.targets 208 | 209 | # Nuget personal access tokens and Credentials 210 | nuget.config 211 | 212 | # Microsoft Azure Build Output 213 | csx/ 214 | *.build.csdef 215 | 216 | # Microsoft Azure Emulator 217 | ecf/ 218 | rcf/ 219 | 220 | # Windows Store app package directories and files 221 | AppPackages/ 222 | BundleArtifacts/ 223 | Package.StoreAssociation.xml 224 | _pkginfo.txt 225 | *.appx 226 | *.appxbundle 227 | *.appxupload 228 | 229 | # Visual Studio cache files 230 | # files ending in .cache can be ignored 231 | *.[Cc]ache 232 | # but keep track of directories ending in .cache 233 | !?*.[Cc]ache/ 234 | 235 | # Others 236 | ClientBin/ 237 | ~$* 238 | *~ 239 | *.dbmdl 240 | *.dbproj.schemaview 241 | *.jfm 242 | *.pfx 243 | *.publishsettings 244 | orleans.codegen.cs 245 | 246 | # Including strong name files can present a security risk 247 | # (https://github.com/github/gitignore/pull/2483#issue-259490424) 248 | #*.snk 249 | 250 | # Since there are multiple workflows, uncomment next line to ignore bower_components 251 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 252 | #bower_components/ 253 | 254 | # RIA/Silverlight projects 255 | Generated_Code/ 256 | 257 | # Backup & report files from converting an old project file 258 | # to a newer Visual Studio version. Backup files are not needed, 259 | # because we have git ;-) 260 | _UpgradeReport_Files/ 261 | Backup*/ 262 | UpgradeLog*.XML 263 | UpgradeLog*.htm 264 | ServiceFabricBackup/ 265 | *.rptproj.bak 266 | 267 | # SQL Server files 268 | *.mdf 269 | *.ldf 270 | *.ndf 271 | 272 | # Business Intelligence projects 273 | *.rdl.data 274 | *.bim.layout 275 | *.bim_*.settings 276 | *.rptproj.rsuser 277 | *- [Bb]ackup.rdl 278 | *- [Bb]ackup ([0-9]).rdl 279 | *- [Bb]ackup ([0-9][0-9]).rdl 280 | 281 | # Microsoft Fakes 282 | FakesAssemblies/ 283 | 284 | # GhostDoc plugin setting file 285 | *.GhostDoc.xml 286 | 287 | # Node.js Tools for Visual Studio 288 | .ntvs_analysis.dat 289 | node_modules/ 290 | 291 | # Visual Studio 6 build log 292 | *.plg 293 | 294 | # Visual Studio 6 workspace options file 295 | *.opt 296 | 297 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 298 | *.vbw 299 | 300 | # Visual Studio LightSwitch build output 301 | **/*.HTMLClient/GeneratedArtifacts 302 | **/*.DesktopClient/GeneratedArtifacts 303 | **/*.DesktopClient/ModelManifest.xml 304 | **/*.Server/GeneratedArtifacts 305 | **/*.Server/ModelManifest.xml 306 | _Pvt_Extensions 307 | 308 | # Paket dependency manager 309 | .paket/paket.exe 310 | paket-files/ 311 | 312 | # FAKE - F# Make 313 | .fake/ 314 | 315 | # CodeRush personal settings 316 | .cr/personal 317 | 318 | # Python Tools for Visual Studio (PTVS) 319 | __pycache__/ 320 | *.pyc 321 | 322 | # Cake - Uncomment if you are using it 323 | # tools/** 324 | # !tools/packages.config 325 | 326 | # Tabs Studio 327 | *.tss 328 | 329 | # Telerik's JustMock configuration file 330 | *.jmconfig 331 | 332 | # BizTalk build output 333 | *.btp.cs 334 | *.btm.cs 335 | *.odx.cs 336 | *.xsd.cs 337 | 338 | # OpenCover UI analysis results 339 | OpenCover/ 340 | 341 | # Azure Stream Analytics local run output 342 | ASALocalRun/ 343 | 344 | # MSBuild Binary and Structured Log 345 | *.binlog 346 | 347 | # NVidia Nsight GPU debugger configuration file 348 | *.nvuser 349 | 350 | # MFractors (Xamarin productivity tool) working folder 351 | .mfractor/ 352 | 353 | # Local History for Visual Studio 354 | .localhistory/ 355 | 356 | # BeatPulse healthcheck temp database 357 | healthchecksdb 358 | 359 | # Backup folder for Package Reference Convert tool in Visual Studio 2017 360 | MigrationBackup/ 361 | 362 | # Ionide (cross platform F# VS Code tools) working folder 363 | .ionide/ 364 | 365 | # Fody - auto-generated XML schema 366 | FodyWeavers.xsd 367 | 368 | # VS Code files for those working on multiple tools 369 | .vscode/* 370 | !.vscode/settings.json 371 | !.vscode/tasks.json 372 | !.vscode/launch.json 373 | !.vscode/extensions.json 374 | *.code-workspace 375 | 376 | # Local History for Visual Studio Code 377 | .history/ 378 | 379 | # Windows Installer files from build outputs 380 | *.cab 381 | *.msi 382 | *.msix 383 | *.msm 384 | *.msp 385 | 386 | # JetBrains Rider 387 | .idea/ 388 | *.sln.iml -------------------------------------------------------------------------------- /ImNotGoodAtDrawingButTracing/ImNotGoodAtDrawingButTracing.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.30611.23 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ImNotGoodAtDrawingButTracing", "ImNotGoodAtDrawingButTracing\ImNotGoodAtDrawingButTracing.csproj", "{A4C223C9-8B4D-4B02-A19D-9E7C55DE6B63}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {A4C223C9-8B4D-4B02-A19D-9E7C55DE6B63}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {A4C223C9-8B4D-4B02-A19D-9E7C55DE6B63}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {A4C223C9-8B4D-4B02-A19D-9E7C55DE6B63}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {A4C223C9-8B4D-4B02-A19D-9E7C55DE6B63}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {94259C52-726B-49EC-951E-1AA756EA3928} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /ImNotGoodAtDrawingButTracing/ImNotGoodAtDrawingButTracing/App.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /ImNotGoodAtDrawingButTracing/ImNotGoodAtDrawingButTracing/Form1.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace ImNotGoodAtDrawingButTracing 2 | { 3 | partial class Form1 4 | { 5 | /// 6 | /// 필수 디자이너 변수입니다. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// 사용 중인 모든 리소스를 정리합니다. 12 | /// 13 | /// 관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form 디자이너에서 생성한 코드 24 | 25 | /// 26 | /// 디자이너 지원에 필요한 메서드입니다. 27 | /// 이 메서드의 내용을 코드 편집기로 수정하지 마세요. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | this.ImagePathLabel = new System.Windows.Forms.Label(); 32 | this.ImageFileTextBox = new System.Windows.Forms.TextBox(); 33 | this.FindImageButton = new System.Windows.Forms.Button(); 34 | this.ImageUrlTextBox = new System.Windows.Forms.TextBox(); 35 | this.ImageUrlLabel = new System.Windows.Forms.Label(); 36 | this.FileDialog = new System.Windows.Forms.OpenFileDialog(); 37 | this.ImageBox = new System.Windows.Forms.PictureBox(); 38 | this.LoadUrlImageButton = new System.Windows.Forms.Button(); 39 | this.LoadFileImage = new System.Windows.Forms.Button(); 40 | ((System.ComponentModel.ISupportInitialize)(this.ImageBox)).BeginInit(); 41 | this.SuspendLayout(); 42 | // 43 | // ImagePathLabel 44 | // 45 | this.ImagePathLabel.AutoSize = true; 46 | this.ImagePathLabel.Location = new System.Drawing.Point(12, 15); 47 | this.ImagePathLabel.Name = "ImagePathLabel"; 48 | this.ImagePathLabel.Size = new System.Drawing.Size(101, 12); 49 | this.ImagePathLabel.TabIndex = 0; 50 | this.ImagePathLabel.Text = "이미지 파일 위치:"; 51 | // 52 | // ImageFileTextBox 53 | // 54 | this.ImageFileTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 55 | | System.Windows.Forms.AnchorStyles.Right))); 56 | this.ImageFileTextBox.Location = new System.Drawing.Point(119, 12); 57 | this.ImageFileTextBox.Name = "ImageFileTextBox"; 58 | this.ImageFileTextBox.Size = new System.Drawing.Size(418, 21); 59 | this.ImageFileTextBox.TabIndex = 1; 60 | // 61 | // FindImageButton 62 | // 63 | this.FindImageButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); 64 | this.FindImageButton.Location = new System.Drawing.Point(542, 10); 65 | this.FindImageButton.Name = "FindImageButton"; 66 | this.FindImageButton.Size = new System.Drawing.Size(75, 23); 67 | this.FindImageButton.TabIndex = 2; 68 | this.FindImageButton.Text = "파일 찾기"; 69 | this.FindImageButton.UseVisualStyleBackColor = true; 70 | this.FindImageButton.Click += new System.EventHandler(this.FindImageButton_Click); 71 | // 72 | // ImageUrlTextBox 73 | // 74 | this.ImageUrlTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 75 | | System.Windows.Forms.AnchorStyles.Right))); 76 | this.ImageUrlTextBox.Location = new System.Drawing.Point(94, 40); 77 | this.ImageUrlTextBox.Name = "ImageUrlTextBox"; 78 | this.ImageUrlTextBox.Size = new System.Drawing.Size(524, 21); 79 | this.ImageUrlTextBox.TabIndex = 3; 80 | // 81 | // ImageUrlLabel 82 | // 83 | this.ImageUrlLabel.AutoSize = true; 84 | this.ImageUrlLabel.Location = new System.Drawing.Point(12, 43); 85 | this.ImageUrlLabel.Name = "ImageUrlLabel"; 86 | this.ImageUrlLabel.Size = new System.Drawing.Size(76, 12); 87 | this.ImageUrlLabel.TabIndex = 4; 88 | this.ImageUrlLabel.Text = "이미지 URL: "; 89 | // 90 | // FileDialog 91 | // 92 | this.FileDialog.FileName = "Sample.png"; 93 | this.FileDialog.Filter = "이미지|*.png;*.jpg;*.bmp"; 94 | // 95 | // ImageBox 96 | // 97 | this.ImageBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 98 | | System.Windows.Forms.AnchorStyles.Left) 99 | | System.Windows.Forms.AnchorStyles.Right))); 100 | this.ImageBox.Location = new System.Drawing.Point(12, 67); 101 | this.ImageBox.Name = "ImageBox"; 102 | this.ImageBox.Size = new System.Drawing.Size(713, 562); 103 | this.ImageBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; 104 | this.ImageBox.TabIndex = 5; 105 | this.ImageBox.TabStop = false; 106 | // 107 | // LoadUrlImageButton 108 | // 109 | this.LoadUrlImageButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); 110 | this.LoadUrlImageButton.Location = new System.Drawing.Point(624, 38); 111 | this.LoadUrlImageButton.Name = "LoadUrlImageButton"; 112 | this.LoadUrlImageButton.Size = new System.Drawing.Size(101, 23); 113 | this.LoadUrlImageButton.TabIndex = 6; 114 | this.LoadUrlImageButton.Text = "이미지 불러오기"; 115 | this.LoadUrlImageButton.UseVisualStyleBackColor = true; 116 | this.LoadUrlImageButton.Click += new System.EventHandler(this.LoadUrlImageButton_Click); 117 | // 118 | // LoadFileImage 119 | // 120 | this.LoadFileImage.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); 121 | this.LoadFileImage.Location = new System.Drawing.Point(624, 10); 122 | this.LoadFileImage.Name = "LoadFileImage"; 123 | this.LoadFileImage.Size = new System.Drawing.Size(101, 23); 124 | this.LoadFileImage.TabIndex = 7; 125 | this.LoadFileImage.Text = "이미지 불러오기"; 126 | this.LoadFileImage.UseVisualStyleBackColor = true; 127 | this.LoadFileImage.Click += new System.EventHandler(this.LoadFileImage_Click); 128 | // 129 | // Form1 130 | // 131 | this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F); 132 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 133 | this.BackColor = System.Drawing.Color.White; 134 | this.ClientSize = new System.Drawing.Size(737, 641); 135 | this.Controls.Add(this.LoadFileImage); 136 | this.Controls.Add(this.LoadUrlImageButton); 137 | this.Controls.Add(this.ImageBox); 138 | this.Controls.Add(this.ImageUrlLabel); 139 | this.Controls.Add(this.ImageUrlTextBox); 140 | this.Controls.Add(this.FindImageButton); 141 | this.Controls.Add(this.ImageFileTextBox); 142 | this.Controls.Add(this.ImagePathLabel); 143 | this.Font = new System.Drawing.Font("굴림", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(129))); 144 | this.MinimumSize = new System.Drawing.Size(400, 400); 145 | this.Name = "Form1"; 146 | this.ShowIcon = false; 147 | this.Text = "Tracer"; 148 | this.TransparencyKey = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(0)))), ((int)(((byte)(64))))); 149 | ((System.ComponentModel.ISupportInitialize)(this.ImageBox)).EndInit(); 150 | this.ResumeLayout(false); 151 | this.PerformLayout(); 152 | 153 | } 154 | 155 | #endregion 156 | 157 | private System.Windows.Forms.Label ImagePathLabel; 158 | private System.Windows.Forms.TextBox ImageFileTextBox; 159 | private System.Windows.Forms.Button FindImageButton; 160 | private System.Windows.Forms.TextBox ImageUrlTextBox; 161 | private System.Windows.Forms.Label ImageUrlLabel; 162 | private System.Windows.Forms.OpenFileDialog FileDialog; 163 | private System.Windows.Forms.PictureBox ImageBox; 164 | private System.Windows.Forms.Button LoadUrlImageButton; 165 | private System.Windows.Forms.Button LoadFileImage; 166 | } 167 | } 168 | -------------------------------------------------------------------------------- /ImNotGoodAtDrawingButTracing/ImNotGoodAtDrawingButTracing/Form1.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Drawing; 3 | using System.IO; 4 | using System.Linq; 5 | using System.Net; 6 | using System.Threading; 7 | using System.Windows.Forms; 8 | 9 | namespace ImNotGoodAtDrawingButTracing 10 | { 11 | public partial class Form1 : Form 12 | { 13 | Thread KeyInputThread; 14 | private bool CapsLockPressed; 15 | 16 | public Form1() 17 | { 18 | InitializeComponent(); 19 | 20 | Load += Form1_Load; 21 | FormClosing += Form1_FormClosing; 22 | } 23 | 24 | private void Form1_Load(object sender, EventArgs e) 25 | { 26 | CapsLockPressed = IsKeyLocked(Keys.CapsLock); 27 | 28 | KeyInputThread = new Thread(() => 29 | { 30 | while (true) 31 | { 32 | Thread.Sleep(200); 33 | 34 | bool tmp = IsKeyLocked(Keys.CapsLock); 35 | 36 | Invoke((MethodInvoker)delegate () 37 | { 38 | UpdateStyles(); 39 | }); 40 | 41 | CapsLockPressed = tmp; 42 | } 43 | }); 44 | KeyInputThread.Start(); 45 | } 46 | 47 | private void Form1_FormClosing(object sender, FormClosingEventArgs e) 48 | { 49 | KeyInputThread.Abort(); 50 | } 51 | 52 | protected override CreateParams CreateParams 53 | { 54 | get 55 | { 56 | CreateParams cp = base.CreateParams; 57 | 58 | if (CapsLockPressed) 59 | { 60 | cp.ExStyle |= 0x80000 | 0x20; 61 | Opacity = .3; 62 | TopMost = true; 63 | } 64 | else 65 | { 66 | Opacity = 1; 67 | TopMost = false; 68 | } 69 | 70 | return cp; 71 | } 72 | } 73 | 74 | private void FindImageButton_Click(object sender, EventArgs e) 75 | { 76 | DialogResult res = FileDialog.ShowDialog(); 77 | 78 | if (res == DialogResult.OK) 79 | { 80 | ImageFileTextBox.Text = FileDialog.FileName; 81 | } 82 | } 83 | 84 | private void LoadFileImage_Click(object sender, EventArgs e) 85 | { 86 | string path = ImageFileTextBox.Text; 87 | 88 | if (File.Exists(path) && (path.EndsWith(".png") || path.EndsWith(".jpg") || path.EndsWith(".bmp"))) 89 | { 90 | ImageBox.Image = Image.FromFile(path); 91 | } 92 | } 93 | 94 | private void LoadUrlImageButton_Click(object sender, EventArgs e) 95 | { 96 | string url = ImageUrlTextBox.Text; 97 | 98 | using (WebClient webClient = new WebClient()) 99 | { 100 | try 101 | { 102 | var req = (HttpWebRequest)WebRequest.Create(url); 103 | req.Method = "HEAD"; 104 | using (var resp = req.GetResponse()) 105 | { 106 | using (Stream stream = webClient.OpenRead(url)) 107 | { 108 | ImageBox.Image = Image.FromStream(stream); 109 | } 110 | } 111 | } 112 | catch { } 113 | } 114 | } 115 | } 116 | } -------------------------------------------------------------------------------- /ImNotGoodAtDrawingButTracing/ImNotGoodAtDrawingButTracing/Form1.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 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 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 17, 17 122 | 123 | -------------------------------------------------------------------------------- /ImNotGoodAtDrawingButTracing/ImNotGoodAtDrawingButTracing/ImNotGoodAtDrawingButTracing.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {A4C223C9-8B4D-4B02-A19D-9E7C55DE6B63} 8 | WinExe 9 | ImNotGoodAtDrawingButTracing 10 | ImNotGoodAtDrawingButTracing 11 | v4.8 12 | 512 13 | true 14 | true 15 | 16 | 17 | AnyCPU 18 | true 19 | full 20 | false 21 | bin\Debug\ 22 | DEBUG;TRACE 23 | prompt 24 | 4 25 | 26 | 27 | AnyCPU 28 | pdbonly 29 | true 30 | bin\Release\ 31 | TRACE 32 | prompt 33 | 4 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | Form 51 | 52 | 53 | Form1.cs 54 | 55 | 56 | 57 | 58 | Form1.cs 59 | 60 | 61 | ResXFileCodeGenerator 62 | Resources.Designer.cs 63 | Designer 64 | 65 | 66 | True 67 | Resources.resx 68 | 69 | 70 | SettingsSingleFileGenerator 71 | Settings.Designer.cs 72 | 73 | 74 | True 75 | Settings.settings 76 | True 77 | 78 | 79 | 80 | 81 | 82 | 83 | -------------------------------------------------------------------------------- /ImNotGoodAtDrawingButTracing/ImNotGoodAtDrawingButTracing/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using System.Windows.Forms; 6 | 7 | namespace ImNotGoodAtDrawingButTracing 8 | { 9 | static class Program 10 | { 11 | /// 12 | /// 해당 애플리케이션의 주 진입점입니다. 13 | /// 14 | [STAThread] 15 | static void Main() 16 | { 17 | Application.EnableVisualStyles(); 18 | Application.SetCompatibleTextRenderingDefault(false); 19 | Application.Run(new Form1()); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /ImNotGoodAtDrawingButTracing/ImNotGoodAtDrawingButTracing/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // 어셈블리에 대한 일반 정보는 다음 특성 집합을 통해 6 | // 제어됩니다. 어셈블리와 관련된 정보를 수정하려면 7 | // 이러한 특성 값을 변경하세요. 8 | [assembly: AssemblyTitle("ImNotGoodAtDrawingButTracing")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("ImNotGoodAtDrawingButTracing")] 13 | [assembly: AssemblyCopyright("Copyright © 2020")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // ComVisible을 false로 설정하면 이 어셈블리의 형식이 COM 구성 요소에 18 | // 표시되지 않습니다. COM에서 이 어셈블리의 형식에 액세스하려면 19 | // 해당 형식에 대해 ComVisible 특성을 true로 설정하세요. 20 | [assembly: ComVisible(false)] 21 | 22 | // 이 프로젝트가 COM에 노출되는 경우 다음 GUID는 typelib의 ID를 나타냅니다. 23 | [assembly: Guid("a4c223c9-8b4d-4b02-a19d-9e7c55de6b63")] 24 | 25 | // 어셈블리의 버전 정보는 다음 네 가지 값으로 구성됩니다. 26 | // 27 | // 주 버전 28 | // 부 버전 29 | // 빌드 번호 30 | // 수정 버전 31 | // 32 | // 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호를 33 | // 기본값으로 할 수 있습니다. 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /ImNotGoodAtDrawingButTracing/ImNotGoodAtDrawingButTracing/Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // 이 코드는 도구를 사용하여 생성되었습니다. 4 | // 런타임 버전:4.0.30319.42000 5 | // 6 | // 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면 7 | // 이러한 변경 내용이 손실됩니다. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace ImNotGoodAtDrawingButTracing.Properties 12 | { 13 | 14 | 15 | /// 16 | /// 지역화된 문자열 등을 찾기 위한 강력한 형식의 리소스 클래스입니다. 17 | /// 18 | // 이 클래스는 ResGen 또는 Visual Studio와 같은 도구를 통해 StronglyTypedResourceBuilder 19 | // 클래스에서 자동으로 생성되었습니다. 20 | // 멤버를 추가하거나 제거하려면 .ResX 파일을 편집한 다음 /str 옵션을 사용하여 21 | // ResGen을 다시 실행하거나 VS 프로젝트를 다시 빌드하십시오. 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class Resources 26 | { 27 | 28 | private static global::System.Resources.ResourceManager resourceMan; 29 | 30 | private static global::System.Globalization.CultureInfo resourceCulture; 31 | 32 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 33 | internal Resources() 34 | { 35 | } 36 | 37 | /// 38 | /// 이 클래스에서 사용하는 캐시된 ResourceManager 인스턴스를 반환합니다. 39 | /// 40 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 41 | internal static global::System.Resources.ResourceManager ResourceManager 42 | { 43 | get 44 | { 45 | if ((resourceMan == null)) 46 | { 47 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ImNotGoodAtDrawingButTracing.Properties.Resources", typeof(Resources).Assembly); 48 | resourceMan = temp; 49 | } 50 | return resourceMan; 51 | } 52 | } 53 | 54 | /// 55 | /// 이 강력한 형식의 리소스 클래스를 사용하여 모든 리소스 조회에 대해 현재 스레드의 CurrentUICulture 속성을 56 | /// 재정의합니다. 57 | /// 58 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 59 | internal static global::System.Globalization.CultureInfo Culture 60 | { 61 | get 62 | { 63 | return resourceCulture; 64 | } 65 | set 66 | { 67 | resourceCulture = value; 68 | } 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /ImNotGoodAtDrawingButTracing/ImNotGoodAtDrawingButTracing/Properties/Resources.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 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 | text/microsoft-resx 107 | 108 | 109 | 2.0 110 | 111 | 112 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 113 | 114 | 115 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | -------------------------------------------------------------------------------- /ImNotGoodAtDrawingButTracing/ImNotGoodAtDrawingButTracing/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace ImNotGoodAtDrawingButTracing.Properties 12 | { 13 | 14 | 15 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 16 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] 17 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase 18 | { 19 | 20 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 21 | 22 | public static Settings Default 23 | { 24 | get 25 | { 26 | return defaultInstance; 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /ImNotGoodAtDrawingButTracing/ImNotGoodAtDrawingButTracing/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ImNotGoodAtDrawingButTracing/ImNotGoodAtDrawingButTracing/pencil.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/choshinyoung/Tracer/18b593d2c4be4c64118ca623614cb9b230edb748/ImNotGoodAtDrawingButTracing/ImNotGoodAtDrawingButTracing/pencil.ico -------------------------------------------------------------------------------- /ImNotGoodAtDrawingButTracing/ImNotGoodAtDrawingButTracing/pencil.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/choshinyoung/Tracer/18b593d2c4be4c64118ca623614cb9b230edb748/ImNotGoodAtDrawingButTracing/ImNotGoodAtDrawingButTracing/pencil.png -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 choshinyoung 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Tracer 2 | 난 그림은 못그리지만 트레이싱은 잘하지 3 | 4 | ## 프로그램 설명 5 | Tracer는 트레이싱을 도와주는 프로그램입니다. 6 | 원하는 이미지를 반투명하게 보이게 만들고, 7 | 그림판, 그림 퀴즈 게임 등 위에 이 프로그램을 올리고 그림을 따라 그릴 수 있습니다. 8 | 9 | **이 프로그램을 사용하여 일어난 일에 대한 어떤 책임도 지지 않습니다.** 10 | 11 | ## 사용 방법 12 | 13 | ### 컴퓨터에서 이미지 불러오기 14 | "이미지 파일 위치" 입력 박스에 컴퓨터에서의 이미지의 위치를 적거나, 15 | "파일 찾기" 버튼으로 파일 탐색기에서 이미지 파일을 선택할 수 있습니다. 16 | 파일을 찾은 후에는 오른쪽의 "이미지 불러오기" 버튼을 눌러주세요. 17 | 해당 파일이 없거나 이미지 파일이 아니라면 불러와지지 않을 수 있습니다. 18 | 19 | ### URL로 이미지 불러오기 20 | "이미지 URL" 입력 박스에 인터넷에서 찾은 이미지의 링크를 복사해 붙여넣은 후, 21 | 이미지 불러오기 버튼으로 이미지를 불러올 수 있습니다. 22 | 만약 해당 URL이 없거나, 이미지가 아니라면 불러와지지 않을 수 있습니다. 23 | 24 | 25 | Caps Lock키를 눌려진 상태로 바꾸면, 프로그램 창이 반투명해지고, 마우스 입력이 프로그램을 통과합니다. 26 | 이제 이 프로그램을 사용해서 이미지를 트레이싱 할 수 있습니다. 27 | 28 | 다시 Caps Lock 키를 눌러 눌려지지 않은 상태로 바꾸면 이미지를 변경하거나, 프로그램을 종료할 수 있습니다. 29 | 30 | [Pencil Icon](https://iconscout.com/icons/pencil) by Thanga Vignesh P 31 | --------------------------------------------------------------------------------