[.Net] ์ด๋ฏธ์ง ๋ทฐ์ด๋ ImageGlass๋ก ์ฝ๊ฒ ๊ฐ๋ฐํ๊ธฐ
์ด๋ฏธ์ง ๋ทฐ์ด(Image Viewer)
๋น์ ํ๋ก๊ทธ๋จ์์ ์ด๋ฏธ์ง ๋ทฐ์ด๋ ์ค์๊ฐ์ผ๋ก ์ทจ๋๋๋ ์นด๋ฉ๋ผ ์์์ด๋ ๊ฒ์ฌ ๊ฒฐ๊ณผ ์ด๋ฏธ์ง๋ฅผ ๋์ฐ๋ ์ญํ ์ ํฉ๋๋ค. ๋ณดํต์ Picture Box
๋ Panel
์๋ค๊ฐ ๊ทธ๋ฆฌ๊ธฐ ๋ง๋ จ์ธ๋ฐ์. ๋ง์ฝ, ๋ฌดํฑ๋๊ณ ์นด๋ฉ๋ผ ์์์ ๋ฐ๋ ๊ทธ๋๋ก ์ถ๋ ฅํ๋ฉด ํ๋ก๊ทธ๋จ ๋ฐ์ ์๋์ ์ํฅ์ ์ฃผ๊ฒ ๋ฉ๋๋ค. ๊ณ ํด์๋์ ์ด๋ฏธ์ง๋ฅผ ์ปจํธ๋กค์ ํฌ๊ธฐ์ ๋ง์ถฐ Stretch ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๊ฑฐ๋ ๋น ๋ฅธ ์๋๋ก ์ปจํธ๋กค์ ์ด๋ฏธ์ง๋ฅผ ์
๋ฐ์ดํธํ๋ฉด UI ๋ฐ์ ์๋๊ฐ ๋๋ ค์ง๊ธฐ ๋๋ฌธ์
๋๋ค.
๊ทธ๋ฐ๋ฐ ๋ณดํต์ ์ด๋ฐ ๊ฑฑ์ ์ ํ ํ์๊ฐ ์์ต๋๋ค. ๋๋ถ๋ถ์ ํ๋ก๊ทธ๋จ์ ์์์ ์ฒ์ฒํ ๋์ฐ๊ฑฐ๋ ๋น ๋ฅด๊ฒ ๋์ฐ๋๋ผ๋ ์ค์๊ฐ์ผ๋ก ํ๋ก๊ทธ๋จ์ ์กฐ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ํ์ง๋ง ๋น์ ํ๋ก๊ทธ๋จ๊ณผ ๊ฐ์ด ์ค์๊ฐ์ผ๋ก ๋ค์์ ์นด๋ฉ๋ผ ์์์ ๋์ฐ๋ฉด์ ์ ์ด๊ฐ ํ์ํ ์ํฉ์ด๋ผ๋ฉด ์๊ธฐ๊ฐ ๋ฌ๋ผ์ง๋๋ค. ์ด๋ฏธ์ง ํ๋/์ถ์, ๋ง์ฐ์ค Drag & Drop์ ๋ฐ๋ฅธ ์ด๋, ์ค์๊ฐ ๊ฐฑ์ ์ ๋ฐ๋ผ ์๋ต ์๋๊ฐ ๋๋ ค์ง๋ฉด ์ฌ์ฉ์ ์ ์ฅ์์๋ ์ฐธ์ผ๋ก ๋ต๋ตํ๊ณ ์ ๋ขฐ์ฑ์ด ๋จ์ด์ง๊ธฐ ๋๋ฌธ์ ๋๋ค.
์๋ก ์ด ๊ธธ์์ต๋๋ค. ๊ทธ๋์ ๋ณธ๋ฌธ์์๋ ์ด๋ฏธ์ง ๋ทฐ์ด๋ฅผ ์ด๋ป๊ฒ ๊ฐ๋ฐํ๋์ง, ๊ทธ๋ฆฌ๊ณ ImageGlass
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฅ์ ์ด ๋ฌด์์ด๊ณ ์ผ๋ง๋ ๊ฐ๋ฐํ๊ธฐ ํธ๋ฆฌํด์ง๋์ง ์ค๋ช
ํฉ๋๋ค.
์ง์ ์ด๋ฏธ์ง ๋ทฐ์ด ๋ง๋๋ ๋ฐฉ๋ฒ
ImageGlass๋ฅผ ์ค๋ช ํ๊ธฐ์ ์์, ์ด๋ฏธ์ง ๋ทฐ์ด๋ฅผ ์ง์ ์ด๋ป๊ฒ ๋ง๋๋์ง ์์๋ณด๊ฒ ์ต๋๋ค.
๋์ ์ดํดํ๊ธฐ
์๋์ ๊ฐ์ด 500x500 ํฌ๊ธฐ์ ์ด๋ฏธ์ง์ 400x400์ ์ปจํธ๋กค์ด ์๋ค๊ณ ์์๋ฅผ ๋ค๊ฒ ์ต๋๋ค.
๊ทธ๋ฆผ ํ์ผ์ ๊ฐ๋ก, ์ธ๋ก ํฌ๊ธฐ๊ฐ ์ปจํธ๋กค์ ํฌ๊ธฐ๋ณด๋ค ํฝ๋๋ค. ์ด ๊ฒฝ์ฐ, ๊ทธ๋ฆผ์ ์ปจํธ๋กค์ ๋ค์๊ณผ ๊ฐ์ด ๊ทธ๋ ค์ง๋๋ค.
์ฆ, ์ปจํธ๋กค์ ์์ญ์ ๋ฒ์ด๋ ๋ถ๋ถ์ ๊ทธ๋ ค์ง๋ฉด ์ ๋๋ฉฐ, ๋ง์ฐ์ค ๋๋๊ทธ ์ค ๋๋กญ์ด๋ ์คํฌ๋กค ๋ฐ ์ด๋์ผ๋ก ์์ offset์ด ์ ์ฉ๋์ด ๊ทธ๋ ค์ ธ์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์์ offset์ด ๋ณ๊ฒฝ๋๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๊ทธ๋ ค์ง๊ฒ ๋ฉ๋๋ค.
๋ง์ฐ์ค ๋๋๊ทธ ์ค ๋๋กญ์ ๋ฐ๋ผ offset์ ๊ณ์ฐํ๊ธฐ ์ํด์๋ LButtonDown
, LButtonUp
, MouseMove
์ด๋ฒคํธ๊ฐ ํ์ํฉ๋๋ค. ๋๋จธ์ง๋ ๊ทธ๋ฆผ์ ๋ถ๋ฌ์ค๊ณ ๊ทธ๋ฆฌ๋ ํจ์๋ง ๊ตฌํํ๋ฉด ๋์
๋๋ค. ๋ฌผ๋ก , ํ์์ ๋ฐ๋ผ ํ๋/์ถ์ ๊ธฐ๋ฅ๋ ํ์ํ๊ณ ์ค๋ฒ๋ ์ด๊ฐ ํ์ํ ์๋ ์์ต๋๋ค.
์ด์จ๋ , ์ด๊ฒ ๋ค์ ๋๋ค. ๊ทธ๋ผ, ์ค์ ๊ตฌํ์ ์ด๋ป๊ฒ ํ๋์ง ์ฝ๋๋ฅผ ์์๋ณด๊ฒ ์ต๋๋ค.
๋ฐ๋ผ ํ๊ธฐ
ExamViewer ์ด๋ฆ์ Windows Forms ์ฑ
ํ๋ก์ ํธ๋ฅผ ์์ฑํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์๋ฃจ์
ํ์ผ์ MyViewer ์ด๋ฆ์ ์ปจํธ๋กค ๋ผ์ด๋ธ๋ฌ๋ฆฌ
๋ฅผ ์ถ๊ฐํฉ๋๋ค.
์์ ๊ฐ์ด ๋ ๊ฐ์ ํ๋ก์ ํธ๋ฅผ ์ถ๊ฐํ๋ฉด ์๋์ ๊ฐ์ ๋ชจ์ต์ด ๋ฉ๋๋ค.
UserControl1.cs
์ ์ฝ๋ ๊ตฌํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์ฃผ์์ผ๋ก ๊ฐ๋จํ ์ค๋ช
์ ์ถ๊ฐํ์ต๋๋ค.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace MyViewer
{
public partial class UserControl1: UserControl
{
Point _leftClick = Point.Empty; //์ผ์ชฝ ๋ง์ฐ์ค ํด๋ฆญ ์ขํ
Point _offset = Point.Empty; //๋ง์ฐ์ค ๋๋๊ทธ ์ค ๋๋กญ offset ๊ณ์ฐ
Point _lastOffset = new Point(0, 0); //๋ง์ง๋ง offset ๋ณด๊ด ์ฉ๋
Bitmap _bitmap = null; //ํ์ผ๋ก ๋ถ๋ฌ์จ ์ด๋ฏธ์ง
Bitmap _canvas = null; //๋๋ธ ๋ฒํผ๋ง์ ์ํ ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง
SolidBrush _background = new SolidBrush(Color.FromArgb(255, 255, 255)); //๋ฐฐ๊ฒฝ ์์
Rectangle _sizeCanvas = new Rectangle(0, 0, 0, 0); //๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง์ ํฌ๊ธฐ
Rectangle _sizeSrc = new Rectangle(0, 0, 0, 0); //๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง์ ๊ทธ๋ ค์ง ์๋ณธ ์ด๋ฏธ์ง์ ์์น
Graphics _g = null; //๊ทธ๋ ค์ง ์ปจํธ๋กค์ ํธ๋ค
public UserControl1()
{
InitializeComponent();
_canvas = new Bitmap(this.Width, this.Height);
_sizeCanvas.Width = this.Width;
_sizeCanvas.Height = this.Height;
_sizeSrc.X = 0;
_sizeSrc.Y = 0;
_sizeSrc.Width = this.Width;
_sizeSrc.Height = this.Height;
_g = this.CreateGraphics();
}
public void LoadImage(string path)
{
_bitmap = (Bitmap)Image.FromFile(path);
draw(_g);
}
private void draw(Graphics g)
{
if (_bitmap != null)
{
var graphics = Graphics.FromImage(_canvas);
graphics.FillRectangle(_background, _sizeCanvas);
_sizeSrc.X = -_offset.X;
_sizeSrc.Y = -_offset.Y;
graphics.DrawImage(_bitmap, 0, 0, _sizeSrc, GraphicsUnit.Pixel);
g.DrawImage(_canvas, 0, 0);
}
}
private void UserControl1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
_offset.X = e.Location.X - _leftClick.X;
_offset.Y = e.Location.Y - _leftClick.Y;
_offset.X += _lastOffset.X;
_offset.Y += _lastOffset.Y;
draw(_g); //CPU ๋ถํ๊ฐ ๋์
}
}
private void UserControl1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
_leftClick = e.Location;
}
}
private void UserControl1_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
_lastOffset = _offset;
}
}
}
}
์ฝ๋๋ ์๋์ ์ฒจ๋ถ๋ ํ์ผ์ ์ฐธ๊ณ ํ์ธ์.
๋ง์ฐ์ค ์ผ์ชฝ ๋ฒํผ์ ํด๋ฆญ(Down, Up) ๋์๊ณผ ์์ง์(Move)์ ๋ฐ๋ผ offset ์ขํ๊ฐ ๊ณ์ฐ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ MouseMove ์ด๋ฒคํธ์์ ์ผ์ชฝ ๋ฒํผ์ด ํด๋ฆญ๋์ด ์๋ค๋ฉด(๋๋๊ทธ ์ค ๋๋กญ) ์ด๋ฏธ์ง ๊ทธ๋ฆฌ๋ ์์ (draw)๋ ์ค์๋ฉ๋๋ค.
draw()
ํจ์์์๋ _bitmap
์ ์ปจํธ๋กค์ ๋ฐ๋ก ๊ทธ๋ฆฌ์ง ์์ต๋๋ค. _bitmap์ ์ปจํธ๋กค์ ๋ฐ๋ก ๊ทธ๋ฆฌ๊ฒ ๋๋ฉด, ์ด๋ฏธ์ง๋ฅผ ๋ฐฐ๊ฒฝ์ ๊ณ์ ๋ง๊ทธ๋ฆฌ๊ฒ ๋์ด ๋ง์ฐ์ค ์ด๋์ ๋ฐ๋ผ ์์์ด ๋จ๊ฒ ๋ฉ๋๋ค. ๋ฐ๋ก ์๋์ ๊ฐ์ ๋ชจ์ต์ด ๋ฉ๋๋ค.
๊ทธ๋์ ์ปจํธ๋กค ํฌ๊ธฐ์ ๋ง๋ ์์ ๋นํธ๋งต์ธ _canvas
๋ฅผ ์์ฑํ์ฌ ๋๋ธ ๋ฒํผ๋ง
์ผ๋ก ์์์ด ๋จ๋ ํ์์ ๊ฐ์ ํฉ๋๋ค. ์๋ ์ ๋๋ฉ์ด์
์ ์ ์ฝ๋์ ๋์์ ๋ณด์ฌ์ค๋๋ค.
์ฃผ์ ์ฌํญ
๋ง์ฐ์ค๋ก ๋๋๊ทธ ์ค ๋๋กญ์ ์ฌํ๊ฒ ์์ง์ด๋ฉด CPU ๋ถํ์จ์ด ์๋นํ ๋์์ง๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ ค์ง๋ ์ด๋ฏธ์ง๊ฐ ์์ฐ์ค๋ฝ์ง ์์ ๊ฒ๋ ๋ง์ด์ฃ . ์ ์์ ์ฝ๋๋ MouseMove ์ด๋ฒคํธ
์ draw()
๋ฅผ ํธ์ถํ๋ค ๋ณด๋, ๋ง์ฐ์ค ์์ง์์ ๋ฐ๋ผ ๋๋ฌด ๋ง์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๊ฒ์ด ์์ธ์
๋๋ค. ๋์ค์๋ ํ๋, ์ถ์ ๊ธฐ๋ฅ๋ ๋ฃ๋ค ๋ณด๋ฉด ๋ ์ฌํด์ง ๊ฒ์
๋๋ค.
๊ทธ๋์ ์ด๋ฒคํธ๋ฅผ ์ค์ด๋ ์ด๋ป๊ฒ ์์ฐ์ค๋ฝ๊ฒ ์ด๋ฏธ์ง๋ฅผ ๊ทธ๋ ค๋ผ์ง ๋ฐฉ๋ฒ์ ์ฐพ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ํ์ง๋ง, ๊ตณ์ด ์ด๋ฐ ๊ณ ๋ฏผ์ ํ๋ฉด์ ์ด๋ฏธ์ง ๋ทฐ์ด๋ฅผ ๋ง๋ค ํ์๊ฐ ์์๊น์? ๋ณธ์ธ์ด ๋ค ๋ง๋ค์ด์ ๋์ ๊ฒ์ ๋ง๋ค์ด ๊ฐ๋ ๊ฒ๋ ์ข์ง๋ง, ์ฐ๋ฆฌ์๊ฒ ์๊ฐ์ ๋ง์ง ์์ต๋๋ค.
์ด์ ์ด๋ฌํ ๊ฑฑ์ ์ ํ ํ์๊ฐ ์๋, ๋ฌด๋ฃ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ ์ด๋ฏธ์ง ๋ทฐ์ด์ธ ImageGlass๋ฅผ ์์๋ณด๊ฒ ์ต๋๋ค.
์ฌ์ฉํ๊ธฐ ํธํ ์ด๋ฏธ์ง ๋ทฐ์ด, ImageGlass
์ฃผ์ ํน์ง
ImageGlass๋ ์ด๋ฏธ์ง๋ฅผ ๋ณผ ์ ์๋๋ก ๋์์ฃผ๋ ์์ฃผ ๊ฐ๋ฒผ์ด ์์ฉ ํ๋ก๊ทธ๋จ์ ๋๋ค. ์๋์ฐ ์ฌ์ง ๋ทฐ์ด์ฒ๋ผ ์ด๋ฏธ์ง ํ์ผ์ ๋๋ธ ํด๋ฆญํ๋ฉด ๋ฐ๋ก ๋์ด์ง๋ ํ๋ก๊ทธ๋จ์ ๋๋ค.
์ฃผ์ ํน์ง์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋ค์ํ ์ด๋ฏธ์ง ์ค(ํ๋/์ถ์) ๋ชจ๋, ๋ง์ฐ์ค ๋๋๊ทธ ์ค ๋๋กญ ์ด๋ ๊ฐ๋ฅ
- ํด๋ฆฝ๋ณด๋๋ก๋ถํฐ ์ด๋ฏธ์ง ์ด๊ธฐ ๊ฐ๋ฅ
- 70๊ฐ ์ด์์ ์ด๋ฏธ์ง ํฌ๋งท ์ง์
- gif ํธํ ๊ฐ๋ฅํ๋ฉฐ, ์ด๋ฏธ์ง ํ๋ ์ ์ถ์ถ ๋ฐ ์ ๋๋ฉ์ด์ ์ฌ์/์ผ์ ์ค์ง ๊ฐ๋ฅ
- ์ฌ๋ผ์ด๋ ์ผ
- ์ธ๋ค์ผ ๋ณด๊ธฐ
- ๋จ์ถํค ์ง์
- ์นผ๋ผ ์ฑ๋ ์ ํ ๊ฐ๋ฅ
- ์์ ๋ฐ ํฝ์ ๊ฐ ์ถ์ถ ๊ฐ๋ฅ
- ์๋ฅด๊ธฐ ๊ธฐ๋ฅ
- ๋ค์ํ ์ธ์ด ์ง์(ํ๊ตญ์ด ํฌํจ)
- ์ค์นํ(installer)/์คํํ(portable) ์ง์
ImageViewer๋ ์๋ ๊ณต์ ํํ์ด์ง์์ ๋ค์ด๋ก๋ ๊ฐ๋ฅํฉ๋๋ค.
https://imageglass.org/release/imageglass-8-6-7-13-36
๊ทธ๋ผ ๊ฐ๋ฐํ๋ ์ ์ฅ์์์ ์ฃผ์ ํน์ง๋ ์์๋ณด๊ฒ ์ต๋๋ค.
- ์ ์ธ๊ธํ ๊ธฐ๋ฅ๊ณผ ๋์ผ
- GNU General Public License Version3
- ์คํ ์์ค
- C# ์ง์(v8.x: .Net 4.8, v9.0: .Net 6)
- ํ๋์จ์ด ๊ฐ์ ์ง์
- ImageViewer Control ์ง์ํ์ฌ ์ฝ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅ
ํน์ GNU GPLv3 ๋ผ์ด์ ์ค๊ฐ ๊ถ๊ธํ๋ค๋ฉด ์๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
https://www.olis.or.kr/license/Detailselect.do?lId=1072
ImageGlass ์์ค ์ฝ๋๋ ์๋ ๊ณต์ Github ์ฃผ์์์ ๋ค์ด๋ก๋ ๊ฐ๋ฅํฉ๋๋ค.
https://github.com/d2phap/ImageGlass
๋ฐ๋ผ ํ๊ธฐ
ExamImageGlass ์ด๋ฆ์ Windows Forms ์ฑ
ํ๋ก์ ํธ๋ฅผ ์์ฑํฉ๋๋ค.
ImageGlass ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ dll์ ์ฐธ์กฐ๋ก ์ถ๊ฐํด์ผ ํฉ๋๋ค. ์์ค ์ฝ๋๋ฅผ ๋ค์ด๋ก๋ํ๊ณ ๋น๋ํด์ผ ํ์ง๋ง, ์ ๋ ์ด ๊ณผ์ ์ ์๋ตํ๊ณ ์คํ ํ์ผ ๊ฒฝ๋ก์์ dll์ ๊ฐ์ ธ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ WinForm์ ImageBox
์ปจํธ๋กค์ ์ถ๊ฐํฉ๋๋ค. ์ฐธ๊ณ ๋ก, ์ ์ ๊ฒฝ์ฐ์๋ Visual Studio์ ๋์์ด๋์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ฌ ์ฝ๋๋ก ์ง์ ์ถ๊ฐํ์ต๋๋ค. ๋์์ด๋์ ์ฝ๋ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
namespace ExamImageGlass
{
partial class Form1
{
//์๋ต
private void InitializeComponent()
{
this.viewer = new ImageGlass.ImageBoxEx();
this.btnOpen = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// viewer
//
this.viewer.Location = new System.Drawing.Point(5, 5);
this.viewer.Name = "viewer";
this.viewer.Size = new System.Drawing.Size(500, 500);
this.viewer.Dock = System.Windows.Forms.DockStyle.None;
// btnOpen
//
this.btnOpen.Location = new System.Drawing.Point(513, 12);
this.btnOpen.Name = "btnOpen";
this.btnOpen.Size = new System.Drawing.Size(75, 23);
this.btnOpen.TabIndex = 0;
this.btnOpen.Text = "Open";
this.btnOpen.UseVisualStyleBackColor = true;
this.btnOpen.Click += new System.EventHandler(this.btnOpen_Click);
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(600, 520);
this.Controls.Add(this.btnOpen);
this.Controls.Add(this.viewer);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);
}
private ImageGlass.ImageBoxEx viewer;
private System.Windows.Forms.Button btnOpen;
#endregion
}
}
Form1.cs
์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
namespace ExamImageGlass
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
viewer.AllowClickZoom = true; //๋ง์ฐ์ค ํด๋ฆญ์ผ๋ก ํ๋/์ถ์
viewer.ShowPixelGrid = true; //ํ๋ ์ Pixel Grid ํ์ฑํํ๊ธฐ
}
private void btnOpen_Click(object sender, EventArgs e)
{
OpenFileDialog dlg = new OpenFileDialog();
if (dlg.ShowDialog() == DialogResult.OK)
{
viewer.Image = Image.FromFile(dlg.FileName);
}
}
}
}
์ฌ์ฉ ๋ฐฉ๋ฒ์ด ๋๋ฌด ๊ฐ๋จํ์ฃ ? AllowClickZoom
์ ๋ง์ฐ์ค์ ์ผ์ชฝ ๋ฒํผ์ ํ๋, ์ค๋ฅธ์ชฝ ๋ฒํผ์ ์ถ์ ๋์์ ์๋ฏธํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ShowPixelGrid
๋ ํ๋ ๋ฐฐ์จ์ด ๋์์ก์ ๋ Grid๋ฅผ ํํํ๋ ์ต์
์ ์๋ฏธํฉ๋๋ค. ์์ธํ ๋์ ๊ฒฐ๊ณผ๋ ์๋ ์ ๋๋ฉ์ด์
์ ๋ณด๊ฒ ์ต๋๋ค.
์์ ๋ก ๋ง๋ ๋ทฐ์ด๋ณด๋ค ๋ ๋ถ๋๋ฝ๊ณ ์์ฐ์ค๋ฝ๊ฒ ๊ทธ๋ ค์ง๋๋ค. ๋ํ, ๋ง์ฐ์ค ์ด๋์ด๋ ์คํฌ๋กค ๋ฐ ์ด๋์ ๋ฐ๋ผ ์ด๋ฏธ์ง ์ด๋๋ ๊ฐ๋ฅํฉ๋๋ค. ์ฌ์ง์ด ํ๋ ๋ฐฐ์จ์ด ๋์ ๊ฒฝ์ฐ Pixel Grid๊ฐ ํํ๋์ด ๊ตฌ๋ถ์ด ๋์ฑ ์ฌ์์ง๋๋ค. ๋ง์ฝ, ์คํฌ๋กค ๋ฐ ์ฌ์ฉ์ ์์น ์๋๋ค๋ฉด ์ฌ์ฉํ์ง ์๊ฒ ๋ค๋ ์ต์ ์ ์ง์ ํ๋ฉด ๋ฉ๋๋ค.
์ง๊ธ์ ์์๋ก ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ฌ์ค๊ณ ํ๋/์ถ์ ๋ฐ ์ด๋ํ๋ ๋ชจ์ต๋ง ๋ณด์ฌ๋๋ ธ๋๋ฐ์. ImageGlass ์ฌ์ง ๋ทฐ์ด์ฒ๋ผ ์๋ฅด๊ธฐ ๊ธฐ๋ฅ์ด๋ ์ขํ์ ๋ฐ๋ผ ํฝ์ ๊ฐ์ ์ป๋ ๊ธฐ๋ฅ, ์ฑ๋ ์ถ์ถ ๋ฑ ํ์ํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
'Programming > .Net' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[C#] WinForm ๋๊ตฌ ์์์ ์ปจํธ๋กค์ด ์ถ๊ฐ๋์ง ์๋ ๊ฒฝ์ฐ ํด๊ฒฐ ๋ฐฉ๋ฒ
[C#] WinForm ๋๊ตฌ ์์์ ์ปจํธ๋กค์ด ์ถ๊ฐ๋์ง ์๋ ๊ฒฝ์ฐ ํด๊ฒฐ ๋ฐฉ๋ฒ
2022.10.29 -
[C#] WinForm์ Form ๋์์ด๋๊ฐ ์ฌ๋ผ์ง๋ ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ
[C#] WinForm์ Form ๋์์ด๋๊ฐ ์ฌ๋ผ์ง๋ ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ
2022.10.25 -
[.Net] ๋คํธ์ํฌ ์ด๋ํฐ IP์ฃผ์์ ๊ณ ๊ธ ์์ฑ ๋ณ๊ฒฝํ๊ธฐ(์์ ํฌํจ)
[.Net] ๋คํธ์ํฌ ์ด๋ํฐ IP์ฃผ์์ ๊ณ ๊ธ ์์ฑ ๋ณ๊ฒฝํ๊ธฐ(์์ ํฌํจ)
2022.07.16 -
[ASP.NET] ์๋๋ก์ง ๋์ปค(Docker)์์ ์ ๋ ๋์(Selenium) ์๋น์ค ๋ง๋๋ ๋ฐฉ๋ฒ
[ASP.NET] ์๋๋ก์ง ๋์ปค(Docker)์์ ์ ๋ ๋์(Selenium) ์๋น์ค ๋ง๋๋ ๋ฐฉ๋ฒ
2022.05.28