PageRenderTime 136ms CodeModel.GetById 27ms RepoModel.GetById 1ms app.codeStats 0ms

/WEB/App_Code/BLL/Image.cs

https://bitbucket.org/zzare/eko
C# | 938 lines | 601 code | 217 blank | 120 comment | 163 complexity | 53aa4b7f31c77e0301066a40eff567b6 MD5 | raw file
  1. using System;
  2. using System.Data;
  3. using System.Configuration;
  4. using System.Linq;
  5. using System.Web;
  6. using System.Web.Security;
  7. using System.Web.UI;
  8. using System.Web.UI.HtmlControls;
  9. using System.Web.UI.WebControls;
  10. using System.Web.UI.WebControls.WebParts;
  11. using System.Xml.Linq;
  12. using System.Collections.Generic;
  13. using System.Drawing;
  14. using System.Drawing.Imaging;
  15. /// <summary>
  16. /// Summary description for Menu
  17. /// </summary>
  18. public partial class IMAGE
  19. {
  20. public static IMAGE_ORIG GetImageByID(int imgID)
  21. {
  22. eMenikDataContext db = new eMenikDataContext();
  23. return (from r in db.IMAGE_ORIGs where r.IMG_ID == imgID select r).SingleOrDefault();
  24. }
  25. public static IMAGE_ORIG GetImageByID(int imgID, string username)
  26. {
  27. eMenikDataContext db = new eMenikDataContext();
  28. return (from r in db.IMAGE_ORIGs where r.IMG_ID == imgID && r.USERNAME == username select r).SingleOrDefault();
  29. }
  30. public static IMAGE GetImageByID(int imgID, int typeID)
  31. {
  32. eMenikDataContext db = new eMenikDataContext();
  33. return (from r in db.IMAGEs where r.IMG_ID == imgID && r.TYPE_ID == typeID select r).SingleOrDefault();
  34. }
  35. public static vw_Image GetvwImageByID(int imgID, int typeID)
  36. {
  37. eMenikDataContext db = new eMenikDataContext();
  38. return (from r in db.vw_Images where r.IMG_ID == imgID && r.TYPE_ID == typeID select r).SingleOrDefault();
  39. }
  40. public static vw_Image GetvwImageByID(int imgID, int typeID, string username)
  41. {
  42. eMenikDataContext db = new eMenikDataContext();
  43. return (from r in db.vw_Images where r.IMG_ID == imgID && r.TYPE_ID == typeID && r.USERNAME == username select r).SingleOrDefault();
  44. }
  45. public static List<IMAGE> GetImagesByID(int imgID)
  46. {
  47. eMenikDataContext db = new eMenikDataContext();
  48. return (from r in db.IMAGEs where r.IMG_ID == imgID select r).ToList();
  49. }
  50. public static List<IMAGE_TYPE > GetImageTypesByImage(int imgID)
  51. {
  52. eMenikDataContext db = new eMenikDataContext();
  53. return (from r in db.IMAGE_TYPEs join i in db.IMAGEs on r.TYPE_ID equals i.TYPE_ID where i.IMG_ID == imgID select r).ToList();
  54. }
  55. public static List<vw_ImageDesc> GetImageDescsByID(int imgID)
  56. {
  57. eMenikDataContext db = new eMenikDataContext();
  58. return (from l in db.LANGUAGEs join i in (from i in db.IMAGE_LANGs where i.IMG_ID == imgID select i ) on l.LANG_ID equals i.LANG_ID into outer from img in outer.DefaultIfEmpty() orderby l.LANG_ORDER select new vw_ImageDesc { IMG_DESC = img.IMG_DESC, IMG_ID = img.IMG_ID, IMG_TITLE=img.IMG_TITLE, LANG_DESC=l.LANG_DESC, LANG_ID = l.LANG_ID }).ToList();
  59. }
  60. public static List<vw_ImageDesc> GetImageDescsByIDEmenik(int imgID, string username)
  61. {
  62. eMenikDataContext db = new eMenikDataContext();
  63. return (from em in db.EM_USERs
  64. from uc in db.EM_USER_CULTUREs
  65. from c in db.CULTUREs
  66. join i in
  67. (from i in db.IMAGE_LANGs where i.IMG_ID == imgID select i) on c.LANG_ID equals i.LANG_ID into outer
  68. from img in outer.DefaultIfEmpty()
  69. from l in db.LANGUAGEs
  70. where em.USERNAME == username && em.UserId == uc.UserId && c.LCID == uc.LCID && l.LANG_ID == c.LANG_ID
  71. orderby uc.DEFAULT descending , l.LANG_ORDER
  72. select new vw_ImageDesc { IMG_DESC = img.IMG_DESC , IMG_ID = img.IMG_ID, IMG_TITLE = img.IMG_TITLE, LANG_DESC = l.LANG_DESC, LANG_ID = l.LANG_ID }).ToList();
  73. }
  74. public static void SaveImageDesc(int imgID, string langID, string title, string desc) {
  75. eMenikDataContext db = new eMenikDataContext();
  76. IMAGE_LANG img = (from i in db.IMAGE_LANGs where i.IMG_ID == imgID && i.LANG_ID == langID select i).SingleOrDefault() ;
  77. if (img == null)
  78. {
  79. img = new IMAGE_LANG { IMG_ID = imgID, LANG_ID = langID, IMG_TITLE = title, IMG_DESC = desc };
  80. db.IMAGE_LANGs.InsertOnSubmit(img);
  81. }
  82. else
  83. {
  84. img.IMG_TITLE = title;
  85. img.IMG_DESC = desc;
  86. }
  87. db.SubmitChanges();
  88. }
  89. public static IMAGE_ORIG UpdateImage(int imgID, string author, bool active, string username)
  90. {
  91. eMenikDataContext db = new eMenikDataContext();
  92. IMAGE_ORIG o = (from im in db.IMAGE_ORIGs where im.IMG_ID == imgID && im.USERNAME == username select im).SingleOrDefault();
  93. if (o == null)
  94. return o;
  95. o.IMG_ACTIVE = active ;
  96. o.IMG_AUTHOR = author ;
  97. db.SubmitChanges();
  98. return o;
  99. }
  100. public static void DeleteImageFromGallery(int imgID, int galID)
  101. {
  102. eMenikDataContext db = new eMenikDataContext();
  103. // delete image from gallery
  104. IMAGE_GALLERY gal = (from g in db.IMAGE_GALLERies where g.IMG_ID == imgID && g.GAL_ID == galID select g).SingleOrDefault();
  105. if (gal != null)
  106. db.IMAGE_GALLERies.DeleteOnSubmit(gal);
  107. db.SubmitChanges();
  108. // check if image can be deleted
  109. gal = (from g in db.IMAGE_GALLERies where g.IMG_ID == imgID select g).FirstOrDefault();
  110. if (gal == null)
  111. DeleteImage(imgID);
  112. }
  113. public static bool DeleteImage(int imgID)
  114. {
  115. eMenikDataContext db = new eMenikDataContext();
  116. try
  117. {
  118. // delete IMAGE_LANG
  119. List<IMAGE_LANG> lang = (from l in db.IMAGE_LANGs where l.IMG_ID == imgID select l).ToList();
  120. db.IMAGE_LANGs.DeleteAllOnSubmit(lang);
  121. // db.SubmitChanges();
  122. // delete images
  123. var img = (from i in db.IMAGEs where i.IMG_ID == imgID select i).ToList();
  124. db.IMAGEs.DeleteAllOnSubmit(img);
  125. // db.SubmitChanges();
  126. // delete files from disk
  127. foreach (IMAGE i in img)
  128. {
  129. string file = HttpContext.Current.Server.MapPath(i.IMG_URL);
  130. if (System.IO.File.Exists(file))
  131. System.IO.File.Delete(file);
  132. }
  133. // delete image from gallery
  134. var gal = db.IMAGE_GALLERies.Where(w => w.IMG_ID == imgID);
  135. db.IMAGE_GALLERies.DeleteAllOnSubmit(gal);
  136. db.SubmitChanges();
  137. // delete original
  138. IMAGE_ORIG imgO = (from i in db.IMAGE_ORIGs where i.IMG_ID == imgID select i).SingleOrDefault();
  139. db.IMAGE_ORIGs.DeleteOnSubmit(imgO);
  140. db.SubmitChanges();
  141. // delete original file
  142. string fileO = HttpContext.Current.Server.MapPath(imgO.IMG_URL);
  143. if (System.IO.File.Exists(fileO))
  144. System.IO.File.Delete(fileO);
  145. return true;
  146. }
  147. catch (Exception ex)
  148. {
  149. ERROR_LOG.LogError(ex, "DeleteImage");
  150. return false;
  151. }
  152. }
  153. public static void UpdateOrder(int galID, int imgID, int order)
  154. {
  155. eMenikDataContext db = new eMenikDataContext();
  156. IMAGE_GALLERY ig = db.IMAGE_GALLERies.SingleOrDefault(w => w.GAL_ID == galID && w.IMG_ID == imgID);
  157. ig.IMG_ORDER = order < 0 ? 0 : order;
  158. db.SubmitChanges();
  159. }
  160. public static class Common {
  161. public const int MAX_IMAGE_UPLOAD_SIZE = 4194304;// 4MB
  162. public const int MAX_IMAGE_ORIGINAL_SIZE = 2048;
  163. public const int MAX_IMAGE_ORIGINAL_HEIGHT = 1024;
  164. public const int MAX_IMAGE_ORIGINAL_WIDTH = 1024;
  165. public const string DEFAULT_IMAGE_FORMAT = ".jpg";
  166. public static string GetUserImageFolder() {
  167. string usrFolder = "annonymous";
  168. if (HttpContext.Current.User.Identity.IsAuthenticated)
  169. {
  170. EM_USER em_user = EM_USER.GetFromContext();
  171. if (em_user == null) em_user = EM_USER.Current.GetCurrentPage ();
  172. if (em_user == null) em_user = EM_USER.GetUserByUserName(HttpContext.Current.User.Identity.Name);
  173. if (em_user != null)
  174. {
  175. usrFolder = em_user.USERNAME;//+ "_" + em_user.UserId;
  176. }
  177. }
  178. else {
  179. EM_USER usr = EM_USER.GetUserByPageName(HttpContext.Current.Items["pname"].ToString());
  180. if (usr != null)
  181. usrFolder = usr.USERNAME;
  182. }
  183. return "~/userfiles/" + usrFolder + "/";
  184. }
  185. public static string GetUserImageFolder(Guid pageID)
  186. {
  187. string usrFolder = "annonymous";
  188. EM_USER em_user = EM_USER.GetUserByID(pageID);
  189. if (em_user != null)
  190. {
  191. usrFolder = em_user.USERNAME;
  192. }
  193. return "~/userfiles/" + usrFolder + "/";
  194. }
  195. public static string GetNewImageName()
  196. {
  197. return GetNewImageName(".jpg");
  198. }
  199. public static string GetNewImageName(string suffix) {
  200. Guid id = Guid.NewGuid();
  201. return id.ToString() + suffix ;
  202. }
  203. public static bool IsFormatValid(string format) {
  204. format = format.ToLower();
  205. if (String.IsNullOrEmpty(format)) return false;
  206. if (!(format == ".jpg" || format== ".png" || format== ".gif")) return false;
  207. return true;
  208. }
  209. public static string GetFormat( IMAGE_TYPE type, string origFormat) {
  210. // if forced is valid, force format
  211. if (IsFormatValid(type.FILE_TYPE)) return type.FILE_TYPE;
  212. // return original format
  213. if (IsFormatValid(origFormat)) return origFormat;
  214. // force default format
  215. return DEFAULT_IMAGE_FORMAT;
  216. }
  217. public static ImageFormat GetImageFormatFromString(string format){
  218. format = format.ToLower();
  219. switch (format) {
  220. case ".bmp":
  221. return ImageFormat.Bmp;
  222. case ".emf":
  223. return ImageFormat.Emf;
  224. case ".exif":
  225. return ImageFormat.Exif;
  226. case ".gif":
  227. return ImageFormat.Gif;
  228. case ".icon":
  229. return ImageFormat.Icon;
  230. case ".jpeg":
  231. return ImageFormat.Jpeg;
  232. case ".memorybmp":
  233. return ImageFormat.MemoryBmp;
  234. case ".png":
  235. return ImageFormat.Png;
  236. case ".tiff":
  237. return ImageFormat.Tiff;
  238. case ".wmf":
  239. return ImageFormat.Wmf;
  240. }
  241. return ImageFormat.Jpeg;
  242. }
  243. }
  244. // static utility functions
  245. public static class Func
  246. {
  247. /// <summary>
  248. /// Changes image url on image for specified type
  249. /// </summary>
  250. public static void ChangeImage(int imgID, int imgTypeID, string imageURL)
  251. {
  252. eMenikDataContext db = new eMenikDataContext();
  253. IMAGE img = db.IMAGEs.SingleOrDefault(w => w.IMG_ID == imgID && w.TYPE_ID == imgTypeID);
  254. img.IMG_URL = imageURL;
  255. db.SubmitChanges();
  256. }
  257. /// <summary>
  258. /// Changes image url on image for specified type
  259. /// </summary>
  260. public static void ChangeImageSecure(int imgID, int imgTypeID, string imageURL, string usr)
  261. {
  262. eMenikDataContext db = new eMenikDataContext();
  263. IMAGE img = (from i in db.IMAGEs
  264. from o in db.IMAGE_ORIGs
  265. where i.IMG_ID == imgID && i.TYPE_ID == imgTypeID && i.IMG_ID == o.IMG_ID &&o.USERNAME == usr
  266. select i).SingleOrDefault();
  267. img.IMG_URL = imageURL;
  268. db.SubmitChanges();
  269. }
  270. /// <summary>
  271. /// Adds new image. original image and resized image to image_type
  272. /// </summary>
  273. public static IMAGE AddNewImage(System.Drawing.Image imgIn, int imgTypeID, bool deleteOld, string origFormat, string folder)
  274. {
  275. if (imgTypeID < 1) throw new System.Exception("Image type must be set !");
  276. IMAGE_TYPE type = IMAGE_TYPE.GetImageTypeByID(imgTypeID);
  277. return AddNewImage(imgIn, type, new IMAGE_ORIG { IMG_ACTIVE = true }, deleteOld, origFormat, folder );
  278. }
  279. public static IMAGE AddNewImage(System.Drawing.Image imgIn, IMAGE_TYPE imgType, IMAGE_ORIG imgData, bool deleteOld, string origFormat, string uploadFolder)
  280. {
  281. // resize original to maximum size
  282. int tmpWidth = imgType.ORIG_WIDTH;
  283. int tmpHeight = imgType.ORIG_HEIGHT;
  284. string tmpFormat = origFormat;
  285. if (tmpWidth < 1) tmpWidth = IMAGE.Common.MAX_IMAGE_ORIGINAL_WIDTH;
  286. if (tmpHeight < 1) tmpHeight = IMAGE.Common.MAX_IMAGE_ORIGINAL_HEIGHT;
  287. // if format is forced, make new format
  288. tmpFormat = IMAGE.Common.GetFormat(imgType, origFormat);
  289. System.Drawing.Image imgOrig = Utils.ResizeImage(imgIn, tmpWidth, tmpHeight);
  290. // save original image to disk
  291. if (String.IsNullOrEmpty(imgData.IMG_NAME))
  292. imgData.IMG_NAME = IMAGE.Common.GetNewImageName(tmpFormat);
  293. if (String.IsNullOrEmpty(imgData.IMG_FOLDER))
  294. {
  295. if (!String.IsNullOrEmpty(uploadFolder))
  296. imgData.IMG_FOLDER = uploadFolder;
  297. else
  298. imgData.IMG_FOLDER = IMAGE.Common.GetUserImageFolder();
  299. }
  300. if (String.IsNullOrEmpty(imgData.IMG_URL))
  301. imgData.IMG_URL = imgData.IMG_FOLDER + imgData.IMG_NAME;
  302. if (String.IsNullOrEmpty(imgData.USERNAME))
  303. imgData.USERNAME = HttpContext.Current.User.Identity.Name.ToLower();
  304. imgData.DATE_ADDED = DateTime.Now;
  305. // if folder doesn't exist create one
  306. string folder = HttpContext.Current.Server.MapPath(imgData.IMG_FOLDER);
  307. if (!System.IO.Directory.Exists(folder))
  308. System.IO.Directory.CreateDirectory(folder);
  309. // save image
  310. imgOrig.Save(HttpContext.Current.Server.MapPath(imgData.IMG_URL), IMAGE.Common.GetImageFormatFromString(tmpFormat));
  311. // get image size
  312. long size = (new System.IO.FileInfo(HttpContext.Current.Server.MapPath(imgData.IMG_URL))).Length;
  313. imgData.SIZE = size;
  314. // save original image to db
  315. eMenikDataContext db = new eMenikDataContext();
  316. db.IMAGE_ORIGs.InsertOnSubmit(imgData);
  317. db.SubmitChanges();
  318. int imgID = imgData.IMG_ID;
  319. // dispose
  320. db.Dispose();
  321. // if type is not in mandatory types, add image for mandatory type
  322. foreach (int type in SM.BLL.Common.ImageType.MandatoryTypes)
  323. if ( type != imgType.TYPE_ID)
  324. SetNewImageForType(imgIn, imgID, type, deleteOld, tmpFormat);
  325. // save new image for type
  326. return SetNewImageForType(imgIn, imgID, imgType.TYPE_ID, deleteOld, tmpFormat);
  327. }
  328. /// <summary>
  329. /// Adds new image for image type, if it doesn't exist
  330. /// </summary>
  331. public static IMAGE AutoCreateImageForType(int imgID, int typeID, bool deleteOld)
  332. {
  333. IMAGE_ORIG imgOrig = IMAGE.GetImageByID(imgID);
  334. if (imgOrig == null) return null;
  335. IMAGE imgNew = IMAGE.GetImageByID(imgID, typeID);
  336. if (imgNew != null) return imgNew;
  337. // check if file exists
  338. if (!System.IO.File.Exists(HttpContext.Current.Server.MapPath(imgOrig.IMG_URL)))
  339. return null;
  340. // auto create new image for image and type
  341. System.Drawing.Image imgIn = System.Drawing.Image.FromFile(HttpContext.Current.Server.MapPath(imgOrig.IMG_URL));
  342. if (imgIn == null) return null;
  343. return SetNewImageForType(imgIn, imgID, typeID, deleteOld, System.IO.Path.GetExtension(HttpContext.Current.Server.MapPath(imgOrig.IMG_URL)));
  344. }
  345. /// <summary>
  346. /// Adds new images for image type, for all images in gallery
  347. /// </summary>
  348. public static void AutoCreateImagesForGalleryForType(int galID, int typeID)
  349. {
  350. //// get all images in gallery
  351. //List<IMAGE_ORIG> origs = GALLERY.GetImageOrigsFromGallery(galID);
  352. IEnumerable<IMAGE_ORIG> origs = GALLERY.GetImageOrigsFromGalleryWithoutType(galID, typeID);
  353. foreach (IMAGE_ORIG img in origs)
  354. {
  355. AutoCreateImageForType(img.IMG_ID, typeID, true);
  356. }
  357. }
  358. /// <summary>
  359. /// Adds new images for image type, for all images in all gallery on all CWPs with REF_ID
  360. /// </summary>
  361. public static void AutoCreateImagesForImageList(IQueryable <IMAGE_ORIG> imgList, int typeID)
  362. {
  363. //// get all images in gallery
  364. foreach (IMAGE_ORIG img in imgList)
  365. {
  366. AutoCreateImageForType(img.IMG_ID, typeID, true);
  367. }
  368. }
  369. /// <summary>
  370. /// Adds new image for image type
  371. /// </summary>
  372. public static IMAGE SetNewImageForType(System.Drawing.Image imgIn, int imgID, int typeID, bool deleteOld, string format)
  373. {
  374. // smart resize of new image
  375. System.Drawing.Image imgNew = Utils.SmartResizeImage(imgIn, typeID);
  376. eMenikDataContext db = new eMenikDataContext();
  377. IMAGE img = db.IMAGEs.SingleOrDefault(w => w.IMG_ID == imgID && w.TYPE_ID == typeID);
  378. // if image doesn't exist, create it
  379. if (img == null)
  380. {
  381. img = new IMAGE();
  382. img.IMG_ID = imgID;
  383. img.TYPE_ID = typeID;
  384. db.IMAGEs.InsertOnSubmit(img);
  385. }
  386. else if (deleteOld ) {
  387. // delete old image from server
  388. if (System.IO.File.Exists(HttpContext.Current.Server.MapPath(img.IMG_URL)))
  389. System.IO.File.Delete(HttpContext.Current.Server.MapPath(img.IMG_URL));
  390. }
  391. img.IMG_NAME = IMAGE.Common.GetNewImageName(format);
  392. img.IMG_URL = IMAGE.Common.GetUserImageFolder() + img.IMG_NAME;
  393. img.DATE_ADDED = DateTime.Now;
  394. img.PUBLIC = true;
  395. string fileFolder = HttpContext.Current.Server.MapPath(IMAGE.Common.GetUserImageFolder());
  396. if (!System.IO.Directory.Exists(fileFolder))
  397. System.IO.Directory.CreateDirectory(fileFolder);
  398. // save new image
  399. imgNew.Save( HttpContext.Current.Server.MapPath(img.IMG_URL), IMAGE.Common.GetImageFormatFromString(format));
  400. // save new image to db
  401. db.SubmitChanges();
  402. // dispose img
  403. imgNew.Dispose();
  404. // imgIn.Dispose();
  405. return img;
  406. }
  407. public static string CustomCropImage(int imgID, int typeID, int x1, int y1, int x2, int y2, string folder)
  408. {
  409. // get original image
  410. IMAGE_ORIG imOrig = IMAGE.GetImageByID(imgID);
  411. System.Drawing.Image imageOrig = System.Drawing.Image.FromFile(HttpContext.Current.Server.MapPath(imOrig.IMG_URL ));
  412. // get image type
  413. IMAGE_TYPE imgType = IMAGE_TYPE.GetImageTypeByID(typeID);
  414. // get user's croped image
  415. System.Drawing.Image imageUser = IMAGE.Utils.CustomCropImage(imageOrig, x1, y1, x2, y2);
  416. // repair image if necessary
  417. System.Drawing.Image imageNew = IMAGE.Utils.SmartResizeImage(imageUser, imgType.WIDTH, imgType.HEIGHT, imgType.W_MIN, imgType.W_MAX, imgType.H_MIN, imgType.H_MAX, imgType.SIZE_MAX, imgType.CROP_POSITION);
  418. // save new image
  419. if (string.IsNullOrEmpty(folder.Trim())) folder = Common.GetUserImageFolder();
  420. string format = System.IO.Path.GetExtension(HttpContext.Current.Server.MapPath(imOrig.IMG_URL));
  421. string imageUrl = folder + Common.GetNewImageName(format);
  422. string fileFolder = HttpContext.Current.Server.MapPath(folder);
  423. if (!System.IO.Directory.Exists(fileFolder))
  424. System.IO.Directory.CreateDirectory(fileFolder);
  425. imageNew.Save(HttpContext.Current.Server.MapPath(imageUrl), IMAGE.Common.GetImageFormatFromString(format));
  426. //dispose
  427. imageNew.Dispose();
  428. imageOrig.Dispose();
  429. imageUser.Dispose();
  430. // return new image url
  431. return imageUrl;
  432. }
  433. }
  434. // static utility functions
  435. public static class Utils
  436. {
  437. /// <summary>
  438. /// Crops current image with custom parameters
  439. /// </summary>
  440. public static System.Drawing.Image CustomCropImage(System.Drawing.Image imgIn, int x1, int y1, int x2, int y2)
  441. {
  442. int width = (int)Math.Abs(x1-x2) ;
  443. int height = (int)Math.Abs(y1 - y2);
  444. PixelFormat Format = imgIn.PixelFormat;
  445. if (Format.ToString().Contains("Indexed"))
  446. Format = PixelFormat.Format24bppRgb;
  447. Bitmap bmPhoto = new Bitmap(width, height, Format);
  448. bmPhoto.SetResolution(imgIn.HorizontalResolution, imgIn.VerticalResolution);
  449. Graphics grPhoto = Graphics.FromImage(bmPhoto);
  450. grPhoto.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
  451. grPhoto.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
  452. grPhoto.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
  453. grPhoto.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
  454. try
  455. {
  456. grPhoto.DrawImage(imgIn, new Rectangle(0, 0, width, height),
  457. x1, y1, width , height , GraphicsUnit.Pixel);
  458. }
  459. catch (Exception e)
  460. {
  461. throw e;
  462. }
  463. finally
  464. {
  465. // imgIn.Dispose();
  466. grPhoto.Dispose();
  467. }
  468. return bmPhoto ;
  469. }
  470. public static System.Drawing.Image SmartResizeImage(System.Drawing.Image imgIn, int typeID)
  471. {
  472. return SmartResizeImage(imgIn, IMAGE_TYPE.GetImageTypeByID(typeID));
  473. }
  474. public static System.Drawing.Image SmartResizeImage(System.Drawing.Image imgIn,IMAGE_TYPE imgType){
  475. return SmartResizeImage(imgIn, imgType.WIDTH, imgType.HEIGHT, imgType.W_MIN, imgType.W_MAX, imgType.H_MIN, imgType.H_MAX, imgType.SIZE_MAX, imgType.CROP_POSITION);
  476. }
  477. /// <summary>
  478. /// Automatically Resizes/Crops image
  479. /// </summary>
  480. public static System.Drawing.Image SmartResizeImage(System.Drawing.Image imgIn, int width, int height, int minWidth, int maxWidth, int minHeight, int maxHeight, int sizeMax, int cropPosition)
  481. {
  482. float ratioNew = (float)height / (float)width;
  483. float ratioIn = (float)imgIn.Height / (float)imgIn.Width;
  484. int tmpWidth;
  485. int tmpHeight;
  486. // todo: if some min/max are set and some fixed w/h are set : combine
  487. // if fixed H & W
  488. if (width > 0 && height > 0)
  489. { // check if new ratio is OK
  490. double diff = (double) (ratioIn / ratioNew );
  491. // if calculated ratio is different from original for less then 1 %, just resize it
  492. if (diff < 1.001 && diff > 0.999)
  493. return ResizeImage(imgIn, width, height);
  494. else
  495. {
  496. return CropImage(imgIn, width, height, cropPosition);
  497. }
  498. }
  499. // Resize image
  500. if (width > 0 || height > 0)
  501. return ResizeImage(imgIn, width, height);
  502. // if we have range of width/height set
  503. if (maxWidth < 1 || minWidth < 1 || maxHeight < 1 || minHeight < 1)
  504. throw new System.Exception(" Image range is not properly set. All parameters must be > 0. ");
  505. // calculate ratios
  506. float ratioMin = (float)minHeight / (float)maxWidth;
  507. float ratioMax = (float)maxHeight / (float)minWidth;
  508. ratioNew = (float)maxHeight / (float)maxWidth;
  509. // if image is in boundaries, do nothing
  510. if (imgIn.Height <= maxHeight && imgIn.Height >= minHeight && imgIn.Width <= maxWidth && imgIn.Width >= minWidth)
  511. return imgIn;
  512. // if ratio is in boundaries, calculate maximum new resized image
  513. if (ratioIn >= ratioMin && ratioIn <= ratioMax)
  514. {
  515. //calulate new maximum dimensions
  516. if (ratioNew > ratioIn)
  517. {
  518. tmpWidth = maxWidth;
  519. tmpHeight = (int)Math.Round((float)maxWidth * ratioIn);
  520. }
  521. else
  522. {
  523. tmpWidth = (int)Math.Round((float)maxHeight / ratioIn);
  524. tmpHeight = maxHeight;
  525. }
  526. // resize image to new dimensions
  527. return ResizeImage(imgIn, tmpWidth, tmpHeight);
  528. }
  529. // ratio is not in boundaries, image will be cropped to best ratio
  530. else {
  531. if (ratioIn < ratioMin)
  532. {
  533. tmpWidth = maxWidth;
  534. tmpHeight = minHeight;
  535. }
  536. else {
  537. tmpWidth = minWidth ;
  538. tmpHeight = maxHeight;
  539. }
  540. return CropImage(imgIn, tmpWidth, tmpHeight, cropPosition);
  541. }
  542. }
  543. /// <summary>
  544. /// Resizes image to set dimensions. if Width or Height is > 0 then it calculates it to preserve ratio
  545. /// </summary>
  546. public static System.Drawing.Image ResizeImage(System.Drawing.Image imgPhoto, int Width, int Height)
  547. {
  548. int sourceWidth = imgPhoto.Width;
  549. int sourceHeight = imgPhoto.Height;
  550. // if image is smaller, return image
  551. if (sourceHeight <= Height && sourceWidth <= Width) return imgPhoto;
  552. // if only one parameter is set, calculate other one
  553. if (Width < 1 && Height < 1) return null;
  554. if (Width < 1)
  555. {
  556. Width = (int) Math.Round((float)Height * ((float)sourceWidth / (float)sourceHeight));
  557. }
  558. else {
  559. Height = (int)Math.Round((float)Width * ((float)sourceHeight / (float)sourceWidth));
  560. }
  561. PixelFormat Format = imgPhoto.PixelFormat;
  562. if (Format.ToString().Contains("Indexed"))
  563. Format = PixelFormat.Format24bppRgb;
  564. Bitmap bmPhoto = new Bitmap(Width, Height, Format);
  565. bmPhoto.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution);
  566. // to fix bug with gray borders
  567. System.Drawing.Imaging.ImageAttributes attr = new System.Drawing.Imaging.ImageAttributes();
  568. attr.SetWrapMode(System.Drawing.Drawing2D.WrapMode.TileFlipXY);
  569. Graphics grPhoto = Graphics.FromImage(bmPhoto);
  570. // grPhoto.Clear(Color.Red);
  571. grPhoto.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
  572. grPhoto.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
  573. grPhoto.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
  574. grPhoto.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
  575. //grPhoto.DrawImage(imgPhoto,
  576. // new Rectangle(0, 0, Width, Height),
  577. // new Rectangle(0, 0, sourceWidth, sourceHeight),
  578. // GraphicsUnit.Pixel);
  579. grPhoto.DrawImage(imgPhoto,
  580. new Rectangle(0, 0, Width, Height),
  581. 0, 0, sourceWidth, sourceHeight,
  582. GraphicsUnit.Pixel, attr);
  583. grPhoto.Dispose();
  584. attr.Dispose();
  585. //imgPhoto.Dispose();
  586. return bmPhoto;
  587. }
  588. /// <summary>
  589. /// Crops image to set dimensions. Use CropPosition to set initial cropping position
  590. /// </summary>
  591. public static System.Drawing.Image CropImage(System.Drawing.Image imgPhoto, int Width, int Height, int CropPosition)
  592. {
  593. int sourceWidth = imgPhoto.Width;
  594. int sourceHeight = imgPhoto.Height;
  595. int sourceX = 0;
  596. int sourceY = 0;
  597. int destX = 0;
  598. int destY = 0;
  599. double nPercent = 0;
  600. double nPercentW = 0;
  601. double nPercentH = 0;
  602. nPercentW = ((double)Width / (double)sourceWidth);
  603. nPercentH = ((double)Height / (double)sourceHeight);
  604. if (nPercentH < nPercentW)
  605. {
  606. nPercent = nPercentW;
  607. switch (CropPosition)
  608. {
  609. case 1: // top
  610. destY = 0;
  611. break;
  612. case 2: // bottom
  613. destY = (int)Math.Round(Height - (sourceHeight * nPercent));
  614. break;
  615. default: // center
  616. destY = (int)Math.Round((Height - (sourceHeight * nPercent)) / 2);
  617. break;
  618. }
  619. }
  620. else
  621. {
  622. nPercent = nPercentH;
  623. switch (CropPosition)
  624. {
  625. case 3:// left
  626. destX = 0;
  627. break;
  628. case 4://right
  629. destX = (int)Math.Round(Width - (sourceWidth * nPercent));
  630. break;
  631. default://center
  632. destX = (int)Math.Round((Width - (sourceWidth * nPercent)) / 2);
  633. break;
  634. }
  635. }
  636. int destWidth = (int)Math.Round(sourceWidth * nPercent);
  637. int destHeight = (int)Math.Round(sourceHeight * nPercent);
  638. // if image is inside dimensions, return
  639. if (sourceWidth == Width && sourceHeight == Height)
  640. return imgPhoto;
  641. //Bitmap bmPhoto = new Bitmap(Width, Height, PixelFormat.Format24bppRgb);
  642. PixelFormat Format = imgPhoto.PixelFormat;
  643. if (Format.ToString().Contains("Indexed"))
  644. Format = PixelFormat.Format24bppRgb;
  645. // Bitmap bmPhoto = new Bitmap(destWidth, destHeight, Format);
  646. Bitmap bmPhoto = new Bitmap(Width, Height, Format);
  647. bmPhoto.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution);
  648. Graphics grPhoto = Graphics.FromImage(bmPhoto);
  649. //grPhoto.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
  650. // to fix bug with gray borders
  651. System.Drawing.Imaging.ImageAttributes attr = new System.Drawing.Imaging.ImageAttributes();
  652. attr.SetWrapMode(System.Drawing.Drawing2D.WrapMode.TileFlipXY);
  653. grPhoto.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality ;
  654. grPhoto.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
  655. grPhoto.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
  656. grPhoto.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
  657. grPhoto.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy ;
  658. //grPhoto.DrawImage(imgPhoto,
  659. // new RectangleF((float)(destX - 0.5), (float)(destY - 0.5), (float)(destWidth + 1), (float)destHeight + 1), // to fix bug with gray borders
  660. // new Rectangle(sourceX, sourceY, sourceWidth, sourceHeight),
  661. // GraphicsUnit.Pixel);
  662. grPhoto.DrawImage(imgPhoto,
  663. new Rectangle(destX , destY , destWidth , destHeight ),
  664. sourceX, sourceY, sourceWidth, sourceHeight,
  665. GraphicsUnit.Pixel, attr);
  666. grPhoto.Dispose();
  667. attr.Dispose();
  668. // imgPhoto.Dispose();
  669. return bmPhoto;
  670. }
  671. }
  672. //public static IMAGE_TYPE GetTypeByID(int typeID) {
  673. // eMenikDataContext db = new eMenikDataContext();
  674. // return (IMAGE_TYPE )db.IMAGE_TYPEs.SingleOrDefault(w => w.TYPE_ID == typeID);
  675. //}
  676. public class Move {
  677. public static bool MoveImageToPosition(Guid cwpID, int id, int pos, string user)
  678. {
  679. CMS_WEB_PART cwp = CMS_WEB_PART.GetWebpartByID(cwpID , user);
  680. if (cwp == null) return false;
  681. MoveImageToPosition(cwp.ID_INT.Value , id, pos);
  682. return true;
  683. }
  684. public static void MoveImageToPosition(int galID, int id, int pos)
  685. {
  686. int step = 5;
  687. int newOrder = step;// order for first item in list
  688. eMenikDataContext db = new eMenikDataContext();
  689. // get all webparts in zone
  690. var list = (from i in db.IMAGE_ORIGs from g in db.IMAGE_GALLERies where g.GAL_ID == galID && g.IMG_ID == i.IMG_ID orderby g.IMG_ORDER select new {g.IMG_ID , g.IMG_ORDER }).ToList();
  691. // ...without current one
  692. list = list.Where(w => w.IMG_ID != id).ToList();
  693. // item is only one
  694. if (list == null)
  695. {
  696. UpdateOrder(galID, id, newOrder);
  697. return;
  698. }
  699. // item is last one
  700. if ( list.Count <= pos)
  701. {
  702. newOrder = list[list.Count - 1].IMG_ORDER + step;
  703. UpdateOrder(galID, id, newOrder);
  704. return;
  705. }
  706. int ord = step;
  707. // reorder entire list
  708. for (int i = 0; i < list.Count(); i++)
  709. {
  710. if (i == pos || (pos < 0 && i == 0))
  711. {
  712. newOrder = ord;
  713. ord += step;
  714. }
  715. UpdateOrder(galID, list[i].IMG_ID , ord);
  716. ord += step;
  717. }
  718. UpdateOrder(galID, id, newOrder);
  719. }
  720. }
  721. }