이 페이지에서
구문
ImageConverter 기존파일경로, [새로운파일경로], [파일형식], [덮어쓰기], [그림품질], [최대넓이], [최대높이], [좌우반전], [상하반전], [회전각도]
인수구분
형식 설명
기존파일경로
필수
String
크기, 형식, 방향을 변경할 기존 이미지의 파일 경로입니다.
확장자를 포함한 전체 경로를 입력합니다.
새로운파일경로
선택
String
변경 후 새롭게 저장 될 이미지의 파일 경로입니다.
확장자를 포함한 전체 경로를 입력합니다.
파일형식
선택
Long
변경할 이미지 포맷을 지정합니다. 총 5개의 이미지 형식을 지원합니다.
0은 JPG(기본값), 1은 PNG, 2는 BMP, 3은 GIF, 4는 TIFF 포맷으로 변환합니다.
덮어쓰기
선택
Boolean
TRUE일 경우 새로운파일경로에 기존 파일이 존재하면 덮어쓰기 합니다. 기본값은 FALSE 입니다.
그림품질
선택
Long
이미지 품질을 지정하며 100은 최고품질, 0은 최저품질입니다. 기본값은 92 입니다.
JPG 포맷으로 변환시에만 적용됩니다.
최대넓이
선택
Double
변환 될 이미지의 최대 넓이입니다. 기본값은 0 입니다.
최대높이
선택
Double
변환 될 이미지의 최대 높이입니다. 기본값은 0 입니다.
좌우반전
선택
Boolean
TRUE일 경우 좌우반전이 된 이미지를 반환합니다. 기본값은 FALSE 입니다.
상하반전
선택
Boolean
TRUE일 경우 상하반전이 된 이미지를 반환합니다. 기본값은 FALSE 입니다.
회전각도
선택
Double
0보다 클 경우 시계방향, 0보다 작을경우 반시계 방향으로 이미지를 회전합니다. 기본값은 0 입니다.
마스터 코드
복사한 코드는 VBA 편집기(Alt + F11) 새 모듈에 붙여넣어 사용하세요'###############################################################
'오빠두엑셀 VBA 사용자지정함수 (https://www.oppadu.com)
'▶ ImageConverter 함수
'▶ 이미지의 크기, 형식, 방향을 변환합니다.
'▶ 인수 설명
'_____________strPath : 크기, 형식, 방향을 변경할 기존 이미지의 파일 경로입니다. 확장자를 포함한 전체 경로를 입력합니다.
'_____________strNewPath : 변경 후 새롭게 저장 될 이미지의 파일 경로입니다. 확장자를 포함한 전체 경로를 입력합니다.
'_____________lngFormat : 변경할 이미지 포맷을 지정합니다. 총 5개의 이미지 형식을 지원합니다.
'_____________KillExists : TRUE일 경우 새로운파일경로에 기존 파일이 존재하면 덮어쓰기 합니다.
'_____________lngQuality : 기본값은 92 입니다. 이미지 품질을 지정하며 100은 최고품질, 0은 최저품질입니다. JPG 포맷으로 변환시에만 적용됩니다.
'_____________dblMaxW : 변환 될 이미지의 최대 넓이입니다. 기본값은 0 입니다.
'_____________dblMaxH : 변환 될 이미지의 최대 높이입니다. 기본값은 0 입니다.
'_____________blnFilpH : TRUE일 경우 좌우반전이 된 이미지를 반환합니다. 기본값은 FALSE 입니다.
'_____________blnFlipV : TRUE일 경우 상하반전이 된 이미지를 반환합니다. 기본값은 FALSE 입니다.
'_____________dblRotation : 0보다 클 경우 시계방향, 0보다 작을경우 반시계 방향으로 이미지를 회전합니다. 기본값은 0 입니다.
'###############################################################
Public Sub ImageConverter(strPath As String, _
Optional strNewPath As String, _
Optional lngFormat As Long = 0, _
Optional KillExists As Boolean = False, _
Optional lngQuality As Long = 92, _
Optional dblMaxW As Double = 0, _
Optional dblMaxH As Double = 0, _
Optional blnFlipH As Boolean = False, _
Optional blnFlipV As Boolean = False, _
Optional dblRotation As Double = 0)
'----------------------------------------------------
'변수 설정
'----------------------------------------------------
Dim objWIA As Object ' WIA 이미지 파일 오브젝트 입니다.
Dim objIP_1 As Object: Dim objIP_2 As Object: Dim objIP_3 As Object ' WIA 이미지 프로세싱을 위한 ImageProcess 개체입니다.
Dim strFormat As String: Dim strExt As String ' 특정 형식의 파일로 저장하기 위한 WIA 파일형식 및 확장자 입니다.
'----------------------------------------------------
'오류 검사
'----------------------------------------------------
On Error GoTo EH
If lngQuality > 100 Or lngQuality < 0 Then lngQuality = 100
If dblMaxH < 0 Then dblMaxH = 0
If dblMaxV < 0 Then dblMaxV = 0
If IsMissing(strNewPath) Or strNewPath = "" Then strNewPath = strPath
If FileExists(strPath) = False Then GoTo EH_Empty
'----------------------------------------------------
'파일형식 및 확장자 선택
'https://docs.microsoft.com/en-us/previous-versions/windows/desktop/wiaaut/-wiaaut-consts-formatid
'----------------------------------------------------
Select Case lngFormat
Case 0
strFormat = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}"
strExt = "JPG"
Case 1
strFormat = "{B96B3CAF-0728-11D3-9D7B-0000F81EF32E}"
strExt = "PNG"
Case 2
strFormat = "{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}"
strExt = "BMP"
Case 3
strFormat = "{B96B3CB0-0728-11D3-9D7B-0000F81EF32E}"
strExt = "GIF"
Case 4
strFormat = "{B96B3CB1-0728-11D3-9D7B-0000F81EF32E}"
strExt = "TIFF"
End Select
'----------------------------------------------------
'WIA 이미지 필터 적용
'https://docs.microsoft.com/en-us/previous-versions/windows/desktop/wiaaut/-wiaaut-howto-use-filters
'----------------------------------------------------
' 1단계 : Conver 함수 (파일 형식을 변경합니다)
Set objIP_1 = CreateObject("WIA.ImageProcess")
objIP_1.Filters.Add objIP_1.FilterInfos("Convert").FilterID
objIP_1.Filters(1).Properties("FormatID") = strFormat
objIP_1.Filters(1).Properties("Quality") = lngQuality
' 2단계 : RotateFlip 함수 (파일을 반전 또는 회전합니다)
If blnFlipH = True Or blnFlipV = True Or lngroation <> 0 Then
Set objIP_2 = CreateObject("WIA.ImageProcess")
objIP_2.Filters.Add objIP_2.FilterInfos("RotateFlip").FilterID
objIP_2.Filters(1).Properties("FlipHorizontal") = blnFlipH
objIP_2.Filters(1).Properties("FlipVertical") = blnFlipV
objIP_2.Filters(1).Properties("RotationAngle") = lngRotation
End If
' 3단계 : Scale 함수 (파일의 크기를 변경합니다)
If dblMaxH <> 0 Or dblMaxV <> 0 Then
Set objIP_3 = CreateObject("WIA.ImageProcess")
objIP_3.Filters.Add objIP_3.FilterInfos("Scale").FilterID
objIP_3.Filters(1).Properties("MaximumWidth") = dblMaxW
objIP_3.Filters(1).Properties("MaximumHeight") = dblMaxH
End If
' 4단계 : 기존 이미지 파일 불러오기 및 필터 적용
Set objWIA = CreateObject("WIA.ImageFile")
objWIA.LoadFile strPath
Set objWIA = objIP_1.Apply(objWIA)
If Not objIP_2 Is Nothing Then Set objWIA = objIP_2.Apply(objWIA)
If Not objIP_3 Is Nothing Then Set objWIA = objIP_3.Apply(objWIA)
'----------------------------------------------------
'변경된 이미지 파일 저장
'----------------------------------------------------
' 파일명 설정
strNewPath = Left(strNewPath, InStrRev(strNewPath, ".")) & LCase(strExt)
' 기존 파일 삭제여부 체크 (삭제여부 False이고 기존파일 존재시 오류 반환)
If KillExists = True And FileExists(strNewPath) = True Then Kill strNewPath
' 파일 저장 및 명령문 종료
objWIA.SaveFile strNewPath
EH_Exit:
On Error Resume Next
If Not objIP_1 Is Nothing Then Set objIP_1 = Nothing
If Not objIP_2 Is Nothing Then Set objIP_2 = Nothing
If Not objIP_3 Is Nothing Then Set objIP_3 = Nothing
If Not objWIA Is Nothing Then Set objWIA = Nothing
Exit Sub
'----------------------------------------------------
'오류 처리
'----------------------------------------------------
EH_Empty:
MsgBox "입력한 파일이 존재하지 않습니다.", vbOKOnly + vbCritical
GoTo EH_Exit
EH:
MsgBox "오류가 발생하였습니다." & vbNewLine & vbNewLine & _
"발생위치 : " & "ImageConverter" & vbNewLine & _
"오류번호 : " & Err.Number & vbNewLine & _
"오류상세 : " & Err.Description, vbCritical
GoTo EH_Exit
End Sub
Public Function FileExists(ByVal path_ As String) As Boolean
'########################################################
'입력한 파일경로에 파일 존재여부를 확인합니다.
'https://www.oppadu.com/vba-fileexists-함수/
'########################################################
FileExists = (Dir(path_, vbDirectory) <> "")
End Function
활용 예제
PNG 를 JPG 로 변환 · 최대 크기 지정
ImageConverter ThisWorkbook.Path & "\테스트.png", ThisWorkbook.Path & "\변환.jpg", 0, True, , 600, 300
좌우반전하여 PNG 로 저장
ImageConverter ThisWorkbook.Path & "\테스트.png", ThisWorkbook.Path & "\테스트_좌우반전.png", 1, True, blnFlipH:=True
안내사항
윈도우 WIA(Windows Image Acquisition) 라이브러리를 사용하므로 별도의 라이브러리 설정 없이 코드를 붙여넣어 바로 사용할 수 있습니다.
파일 존재 여부를 확인하는 보조 명령문 FileExists 가 함께 필요하며, 위 전체 코드에 포함되어 있습니다.
기존 파일이 없거나, 저장 경로에 같은 파일이 있는데 덮어쓰기가 FALSE 이거나, 저장 권한이 없으면 오류 메시지를 출력하고 종료합니다.
여러개 파일을 한번에 벌크로 작업할수 있는 추가기능도 같이 제공해주시면 너무나도 좋을것 같습니다 !!
잘 변환되고 좋은데 투명 부분이 이리저리 깨져버리네요...
WIA 특성상 PNG의 투명배경은 처리할 수가 없습니다..ㅜㅜ;
그림의 크기가 최대 (Maximum) 라는 조건이 붙어서 비율을 고정시키던데
강제로 늘이는 방법은 없는지요??
.Properties("PreserveAspectRatio").Value = False
위 코드를 추가해보시겠어요?^^감사합니다.
objWIA.LoadFile strPath
이 부분에서 loadfile 실행 시 '매개변수가 틀리다'면서 에러가 뜨는데 이유가 뭘까요..몇개의 이미지를 순차적으로 리사이즈하는 작업인데 두번째 이미지부터 뜹니다.(뜨지 않을때도 있고요)
strPath 로 반환되는 경로가 올바른지 한번 확인해보시면 좋을 것 같습니다. :)