우선은 코드만 올립니다..
using System;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
private string workFolder = Path.Combine(Application.StartupPath, "workFolder");
private int sequence = 0;
public Form1()
{
InitializeComponent();
//이미지 확인을 위해 오토사이즈로 해줍니다.
pictureBox1.SizeMode = PictureBoxSizeMode.AutoSize;
pictureBox2.SizeMode = PictureBoxSizeMode.AutoSize;
}
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
//파일을 불러옵니다.
if (ofd.ShowDialog() == DialogResult.OK)
{
pictureBox1.Image = Image.FromFile(ofd.FileName);
}
}
private void button2_Click(object sender, EventArgs e)
{
if (Directory.Exists(workFolder) == false)
{
Directory.CreateDirectory(workFolder);
}
sequence++; //돌린 횟수! (파일명 겹치지 않도록 해줍니다.)
Image originImage = pictureBox1.Image; //사용될 원본 이미지!
for (int rotation = 1; rotation <= 360; ++rotation) //360도 회전시켜줍니다.
{
int maxAngle = 91;
int width = originImage.Width;
int height = originImage.Height;
int rot; //항상 0 ~ 90도로 만들어줍니다.
if (90 < rotation && rotation <= 181) //해당 구간에서는 반전이 필요합니다.
{
rot = 180 - rotation;
}
else if (270 < rotation && rotation <= 360) //해당 구간에서는 반전이 필요합니다.
{
rot = 360 - rotation;
}
else
{
rot = rotation % maxAngle;
}
double widthRadian = rot * Math.PI / 180;
double heightRadian = (90 - rot) * Math.PI / 180; //90도 기준으로 반전 시켜줍니다.
double w = Math.Cos(widthRadian) * width + Math.Sin(widthRadian) * height;
double h = Math.Cos(heightRadian) * width + Math.Sin(heightRadian) * height;
//기존 이미지 기준으로 돌려줍니다.
DrawImage(originImage,
pictureBox1,
rotation,
width,
height,
width,
height,
"origin_");
//크기가 확장 된 이미지 기준으로 돌려줍니다.
DrawImage(originImage,
pictureBox2,
rotation,
(int)w,
(int)h,
width,
height,
"extend_");
}
originImage.Dispose();
Process.Start(workFolder);
}
private void DrawImage(Image originImage,
PictureBox pictureBox,
int rotation,
int width,
int height,
int centerX,
int centerY,
string imageType)
{
Color backgroundColor = Color.FromArgb(255, 255, 0, 0); //빨강 배경 (알파값을 통해 투명하게 가능!)
Bitmap bitmap = new Bitmap(width, height);
Graphics graphics = Graphics.FromImage(bitmap);
graphics.Clear(backgroundColor); //배경 칠해주기
graphics.TranslateTransform(width / 2, height / 2); //이미지 가운데로 이동
graphics.RotateTransform(rotation); //가운데에서 회전
graphics.DrawImage(originImage, centerX / -2, centerY / -2); //이미지를 가운데 그려줍니다.
string fileName = string.Format("{0}_{1}{2}.png", sequence.ToString("D4"), imageType, rotation.ToString("D4"));
string savePath = Path.Combine(workFolder, fileName);
bitmap.Save(savePath);
graphics.Dispose();
bitmap.Dispose();
pictureBox.Image = Image.FromFile(savePath);
pictureBox.Update();
}
}
}
'C# > Windows Form' 카테고리의 다른 글
[C# Windows Form] 섬네일 현재 영역만 그려주기 (Scroll, Thumbnail) (0) | 2024.11.08 |
---|---|
[C# Windows Form] Invoke, InvokeRequired - (Cross Thread) (0) | 2024.05.08 |
[C# Windows Form] 둥근 버튼 만들기 (GraphicsPath) (0) | 2024.03.11 |
[C# Windows Form] 디자인 문서개요 (요소 계층 구조 표현) (0) | 2024.03.11 |
[C# Windows Form] 로그 클래스 (CallerMemberName) (0) | 2024.02.17 |