제2의 비엔지니어 인생관을 꿈꾸며

Posted
Filed under C#
2년전 쯤 모바일 웹에서 이미지 업로드를 하는 페이지가 있었는데, 모바일로 사진을 찍고, 업로드를 하면, 세로로 촬영한 이미지가 가로로(옆으로) 등록되는 기이한 현상이 일어났다. 당시 잠깐 이유를 생각해보면, 스마트폰의 사진 해상도가 고해상도를 지원하면서, 촬영되는 사진이 아마 폭에따라  가로로 저장되는 이유가 아닐가 생각한다.  아래 코드는 classic ASP 에서 사용하기위해 .net 으로 작성된 lib(dll)
코드이다. 그 당시 버전 관리를 위해 SN(strong name) 생성 후 Regasm ,  gacutil 로 assembly 등록 후  classic ASP 에서 사용하였다

작동원리 : 방법은 간단하다 , 이미지의 rotaton 정보를 가지고 그만큼 반대로 또는 정방향으로 회전시켜 사진을 똑바로 세우는것이다.
아래 이미지는 이미지의 Rotation 정보를 얻어냈을때 리턴되는 값들이다 
 
1:정방향  2:정방향이긴한데, 뒤집어진경우 , 8: 90도 우측으로 기울어진경우 , 아래 이미지를 참고하여 로테이션 시키면된다.


사용자 삽입 이미지


using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.IO;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;

namespace MimiClass
{
    public class Utility
    {
        private string imgName;
        private int stdWidth;

        public string targeImage { set { this.imgName = value;}}
        public int targetWidth { set { this.stdWidth = value;}}
        public Utility()
        {
        }

        public void doReSize()
        {
            this.reSizeEXIF();
        }


        public void reSizeEXIF()       
       {

           //  당시 스토리지를 UNC  명을 익식하게게끔 하려했으나 보안 오류떠서, 네트워크 드라이브로 대체 했던기억이 난다.  
           // 물론 로컬로 저장되는 이미지인경우 아무 상관없다.
          

            string imageF = @"X:\파일명.jpg";
            string iPath = string.Empty;
            int EXIF = 0;
            int iW = 0, iH = 0, iTW = 0, iTH = 0;
            int iStW;
            iStW = this.stdWidth;
            PropertyItem[] PropertyItems;
            Image simg = new Bitmap(imageF);
            Image tImg = null;
            PropertyItems = simg.PropertyItems;
            iW = simg.Width;
            iH = simg.Height;
            foreach (PropertyItem p in PropertyItems)
            {
                if ((p.Id == 0x0112 || p.Id == 5029 || p.Id == 274))
                {
                    EXIF = (int)p.Value[0];
                    break;
                }
            }
            if (EXIF == 0)
            {
                setEXIFRoate("W", ref simg, out tImg, iStW, iW, iH, ref iTW, ref iTH);
            }
            else
            {
                if (EXIF == 6)
                {
                    setEXIFRoate("H", ref simg, out tImg, iStW, iW, iH, ref iTW, ref iTH);
                    tImg.RotateFlip(RotateFlipType.Rotate90FlipNone);
                }
                else if (EXIF == 8)
                {
                    setEXIFRoate("W", ref simg, out tImg, iStW, iW, iH, ref iTW, ref iTH);
                    tImg.RotateFlip(RotateFlipType.Rotate270FlipNone);
                }
                else if (EXIF == 3)
                {
                    setEXIFRoate("W", ref simg, out tImg, iStW, iW, iH, ref iTW, ref iTH);
                    tImg.RotateFlip(RotateFlipType.Rotate180FlipNone);
                }
            }
            imageSave(tImg, imageF);

            simg.Dispose();
            tImg.Dispose();

            simg = null;
            tImg = null;        
        }
        private void imageSave(Image t, string imageF)
        {
            string imageT = string.Empty;
            string iPath = string.Empty;
            imageT = imageF.Substring(imageF.LastIndexOf("\\"));
            iPath = imageF.Substring(0, imageF.LastIndexOf('\\'));
            iPath = string.Concat(iPath, "\\re\\");
            if (!Directory.Exists(iPath))
                Directory.CreateDirectory(iPath);

            iPath = string.Concat(iPath, imageT);

            t.Save(@iPath);
            t.Dispose();
            t = null;
        }
        private void setEXIFRoate(string stGb, ref Image s, out Image t, int iStW, int iW, int iH, ref int iTW, ref int iTH)
        {
            // 이미지가 width가 넓은 사진일경우
            if (stGb == "W")
            {
                // 가로가 길경우 가로와 세로를 바꾼
                iTW = iStW;
                iTH = Convert.ToInt32((iStW * 1.0) / ((iW * 1.0) / (iH * 1.0)));
            }
            else
            {
                // 세로가 길경우 세로와 가로를 바꿈 
                iTH = iStW;
                iTW = Convert.ToInt32((iStW * 1.0) / ((iH * 1.0) / (iW * 1.0)));
            }
            t = new Bitmap(iTW, iTH);
            Graphics g = Graphics.FromImage(t);

           // 화질유지를 위해 고화질 모드 설정
            g.InterpolationMode = InterpolationMode.High;
           
           // 딱 자르면 흰색 라인이 생겨서 +1 추가더 자르고 -1 로 뺏
            g.DrawImage(s, new Rectangle(-1, -1, iTW + 1, iTH + 1)); 음
            g.Dispose();
            g = null;
        }
    }
}
2018/02/08 16:17 2018/02/08 16:17