2023年7月3日发(作者:)
使⽤C#进⾏图⽚转换格式,缩放,⾃动旋转,保留exif(转载)这⼏天⼼⾎来潮做了⼀个批量图⽚缩放,转换格式,并且可以根据exif的信息旋转图⽚,校正exif信息后保存的⼩程序.根据配置⽂件 指定需要的功能.82936373839464748495657585960616263using
System;using
;using
g;using
g;using
g2D;using
pServices;using
;
namespace
PhotoUtil{ class
Program { [DllImport("kernel32")] private
static
extern
long
GetPrivateProfileString(string
section, string
key, string
def, StringBuilder retVal, int
size, string
filePath); private
const
String configFile = "";
public
static
void
Main(string[] args) { DirectoryInfo workingDir = new
DirectoryInfo(ReadConfig("General", "WorkingDir",tDirectory)); if
(!) { workingDir = new
DirectoryInfo(tDirectory); } int
quality=(ReadConfig("General", "Quality", "85")); bool
needResize = (ReadConfig("ResizeImage", "Enable", "false")); int
newWidth = (ReadConfig("ResizeImage", "NewWidth", "800")); int
newHeight = (ReadConfig("ResizeImage", "NewHeight", "600")); bool
padding = (ReadConfig("ResizeImage", "Padding", "false")); bool
needRotate = (ReadConfig("RotateImage", "Enable", "true")); FileInfo[] files = es(); DirectoryInfo output = Subdirectory(ng("yyyyMMdd") + "转换r foreach
(FileInfo i in
files) { String type = r(); if
(ns("jpg") || ns("jpeg") || (ns("png")) || ns("tif") || ns("bmp")) { Image img = le(me); if
(needResize) { ine("Resizing "
+ me); ResizeImage(ref
img, newWidth, newHeight, padding); } if
(needRotate) { ine("Rotating "
+ me); RotateImage(img); } SaveAs(img, me+""+, quality); } } ne(); }
private
static
void
SaveAs(Image img, string
dest, long
quality)63 private
static
void
SaveAs(Image img, string
dest, long
quality)64 {65 if
(quality > 100 || quality < 1) {66 quality = 85;67 }68 EncoderParameters para = new
EncoderParameters();69 [0] = new
EncoderParameter(y, quality);70 String extension = new
FileInfo(dest).Extension;71 ImageCodecInfo info = GetImageCodecInfoByExtension(extension);72 if
(info != null)73 { (dest, info, para);74 }75 else76 {77 throw
new
Exception("Unrecognized format "" + extension + ""!r78 }79 }
80 private
static
void
ResizeImage(ref
Image image, int
expectDestWidth, int
expectDestHeight,bool
padding)81 {82 PropertyItem[] exif = tyItems;83 int
targetWidth = 0;84 int
targetHeight = 0;85 double
srcHWRate = (double) / (double);86 double
expectHWRate = (double)expectDestWidth / (double)expectDestHeight;87 if
(srcHWRate > expectHWRate)88 {89 targetWidth = expectDestWidth;90 targetHeight = 32((expectDestWidth / srcHWRate, 0)); }91 else92 {93 targetHeight = expectDestHeight;94 targetWidth = 32((expectDestHeight * srcHWRate, 0)); }95
96 Image bitmap = null;97 if
(!padding)98 {99 bitmap = new
Bitmap(targetWidth, targetHeight);100 }101 else {102 bitmap = new
Bitmap(expectDestWidth, expectDestHeight);103 }104 Graphics g = age(bitmap);105 itingQuality = ality;106 olationMode = alityBicubic;107 ingMode = ality; age(image, new
Rectangle(0, 0, , ), new
Rectangle(0, 0, , ), );108 foreach
(PropertyItem i in
exif)109 {110 if
( == 40962)111 {112 = es(targetWidth);113 }114 else
if
( == 40963)115 { = es(targetHeight);116 }117 pertyItem(i);118 }119 e();120 e(); image = bitmap;121 }122
123 private
static
string
ReadConfig(String Section, String Key, String defaultValue)124 {125 if
((configFile))126 {127 StringBuilder temp = new
StringBuilder(1024);128 GetPrivateProfileString(Section, Key, , temp, 1024, new
FileInfo(configFile).FullName);129 if
(!OrEmpty(ng()))130 {131 return
ng();131 return
ng(); }132 else133 {134 return
defaultValue;135 }136 } else137 {138 return
defaultValue;139 }140 }141
142 public
static
void
RotateImage(Image img)143 { PropertyItem[] exif = tyItems;144 byte
orientation = 0;145 foreach
(PropertyItem i in
exif)146 {147 if
( == 274)148 {149 orientation = [0];150 [0] = 1;151 pertyItem(i); }152 }153
154 switch
(orientation)155 {156 case
2:157 Flip(NoneFlipX);158 break;159 case
3: Flip(180FlipNone);160 break;161 case
4:162 Flip(NoneFlipY);163 break;164 case
5:165 Flip(90FlipX); break;166 case
6:167 Flip(90FlipNone);168 break;169 case
7:170 Flip(270FlipX);171 break;172 case
8:173 Flip(270FlipNone); break;174 default:175 break;176 }177 foreach
(PropertyItem i in
exif)178 {179 if
( == 40962) {180 = es();181 }182 else
if
( == 40963)183 { = es();184 }185 }186 }187
188 private
static
ImageCodecInfo GetImageCodecInfoByExtension(String extension)189 { ImageCodecInfo[] list = geEncoders();190 foreach(ImageCodecInfo i in
list)191 {192 if
(r().Contains(r()))193 {194 return
i;195 }196 }197 return
null; }198 }199199}2 }配置⽂件名称:,放在和程序同⽬录下,格式如下:[General]#⼯作⽬录WorkingDir=.#输出质量,1-100范围内的整数Quality=80[ResizeImage]#是否启⽤Enable=true#新的宽值和⾼值NewWidth=1024NewHeight=768#是否对超出原来⽐例的部分进⾏填充Padding=false#是否使⽤Exif中的旋转信息对图⽚进⾏旋转[RotateImage]Enable=true1.保留exif信息的技巧是获取原始的tyItems,对新图⽚添加即可.2.关于Exif Orientation标志的定义
3.变更jpeg输出质量的⽅法:EncoderParameters para = new EncoderParameters();[0] = new EncoderParameter(y, quality);//这⾥的quality是从1-100的long值,⼀开始想当然的以为1-100的值就⽤了byte,结果出错了.最后调⽤(String, ImageCodecInfo, EncoderParameters)来进⾏输出.4.进⾏缩放/旋转后需要调整原始的exif信息,id查⽂档可知.列出⼀些id=40962,widthid=40963,heightid=274,orientation type对PropertyItem信息设置完了别忘了pertyItem(PropertyItem)添加到image中,我出⼀个很 傻的bug,就是在修改了orientationtype=1之后没有SetPropertyItem,于是导致图⽚实际被旋转⾄正确⾓度了,但是⽤ACDSee打开后可以看到exif的旋转信息依旧是 原来的值.
发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1688383773a129884.html
评论列表(0条)