使用C#进行图片转换格式,缩放,自动旋转,保留exif(转载)

使用C#进行图片转换格式,缩放,自动旋转,保留exif(转载)

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条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信