여러개의 이미지를 하나의 이미지로 붙이기

안녕하세요 여러개의 이미지 로컬파일을 가지고 하나의 이미지로 합쳐서
일종의 썸네일처럼 써보려고 하는데요,
합치는것 까지는 문제없이 되는데 이미지가 좀 잘려보이는 느낌이 있습니다.
모든 이미지의 사이즈는 동일한데도 그러네요

  1. 이미지 경로 리스트 로드
  2. 결과이미지를 그릴 bitmap 객체를 전체 이미지의 가로세로 길이를 계산해서 생성
  3. 이미지 경로리스트를 반복문 돌면서 이미지 로드, 그래픽스 객체를 이용해서 bitmap에 좌표를 설정해서 그림

아래 코드는 이미지를 병합하는 코드입니다.

string FolderName = diPath;
System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(FolderName);
foreach (System.IO.FileInfo File in di.GetFiles())
{
    string FileNameOnly = File.Name.Substring(0, File.Name.Length - 4);
    string FullFileName = File.FullName;
    imagePathList.Add(FullFileName);
}

Image newImg = Image.FromFile(imagePathList[0]);
int newWidth = newImg.Width * THUMNAIL_MAX_WIDTH_COUNT;
int newHeight = newImg.Height * THUMNAIL_MAX_HEIGHT_COUNT;

Bitmap bitmap = new Bitmap(newWidth, newHeight);
using (Graphics g = Graphics.FromImage(bitmap))
{
    int imgPointX = 0;
    int imgPointY = 0;
    int index = 0;
    foreach (string imgPath in imagePathList)
    {
        using(Image image = Image.FromFile(imgPath))
        {
            g.DrawImage(image, imgPointX, imgPointY);
            if(index % THUMNAIL_MAX_WIDTH_COUNT == THUMNAIL_MAX_WIDTH_COUNT - 1)
            {
                imgPointX = 0;
                imgPointY += image.Height;
            }
            else
            {
                imgPointX += image.Width;
            }
            index++;
        }
    }
}
string result = thumnailPath + "\\result.jpg";
bitmap.Save(result, ImageFormat.Jpeg); 

아래는 결과물 예시입니다. 모든 이미지 크기는 같은데 묘하게 이미지가 조금씩 왜 잘리는지 잘 모르겠네요…
image

자답하겠습니다.

g.DrawImage(image, imgPointX, imgPointY);

코드 중간에 이미지 그리는 부분을 위처럼 쓰지말고

g.DrawImage(image, imgPointX, imgPointY, image.Width, image.Height);

이렇게 이미지의 가로, 세로 길이 파라미터까지 추가해주니까 정상적으로 보이네요…

5개의 좋아요

Graphics.DrawImage 메서드 (System.Drawing) | Microsoft Learn

DrawImage(Image, Int32, Int32)
Draws the specified image, using its original physical size, at the location specified by a coordinate pair.

GDI+를 쓰다보면 흔히 겪는 증상이죠. 이유는 MSDN의 함수 설명에서 찾아볼 수 있는데요, 읽어 보면 '이미지를 지정한 위치에 이미지 원래의 물리 크기로 그린다.'라고 되어 있습니다.

GDI+에서 사용하는 해상도는 96 dpi인데 이미지의 해상도가 지정되지 않으면 이미지를 72dpi로 가정합니다. 이미지를 72 dpi로 가정하므로 이미지의 가로 픽셀 크기가 72일 경우 이 이미지의 폭을 1인치로 처리합니다. Graphics의 대상 버퍼는 96 dpi이므로 1인치를 96픽셀 걸쳐 표시하게 되죠.
따라서 DrawImage 함수를 크기 없이 위치만 지정할 경우 이미지의 원래 물리 크기(인치)를 적용해서 1/3배 크게 그려지게 됩니다ㅎ

2개의 좋아요