markus / ConvertService / ConverterService / ImageFields / SparseImageCreator.cs @ 218e5002
이력 | 보기 | 이력해설 | 다운로드 (32.5 KB)
1 |
using System; |
---|---|
2 |
using System.Collections.Generic; |
3 |
using System.Linq; |
4 |
using System.Text; |
5 |
using System.Diagnostics; |
6 |
using System.Windows.Media; |
7 |
using System.Windows; |
8 |
using System.Security.Permissions; |
9 |
using System.IO; |
10 |
using System.Xml.Linq; |
11 |
using System.Globalization; |
12 |
|
13 |
namespace ImageFields |
14 |
{ |
15 |
public class SparseImageCreator : ImageFieldsBase |
16 |
{ |
17 |
// Fields |
18 |
private Color backgroundColor = defaultOpaqueBackgroundColor; |
19 |
private bool copyMetadata; |
20 |
private static Color defaultAlphaBackgroundColor = Colors.Transparent; |
21 |
private static Color defaultOpaqueBackgroundColor = Colors.White; |
22 |
private const double Epsilon = 1E-10; |
23 |
private bool userSelectedBkColor = false; |
24 |
|
25 |
// Methods |
26 |
public SparseImageCreator() |
27 |
{ |
28 |
this.ServerFormatXML = ServerFormats.Default; |
29 |
this.NoCaching = false; |
30 |
} |
31 |
|
32 |
private Int32Rect ComputeTileRect(ref Rect levelTargetRect) |
33 |
{ |
34 |
int x = (int)Math.Floor((double)(levelTargetRect.Left / ((double)this.TileSize))); |
35 |
if (x < 0) |
36 |
{ |
37 |
x = 0; |
38 |
} |
39 |
int num2 = (int)Math.Ceiling((double)(levelTargetRect.Right / ((double)this.TileSize))); |
40 |
int y = (int)Math.Floor((double)(levelTargetRect.Top / ((double)this.TileSize))); |
41 |
if (y < 0) |
42 |
{ |
43 |
y = 0; |
44 |
} |
45 |
int num4 = (int)Math.Ceiling((double)(levelTargetRect.Bottom / ((double)this.TileSize))); |
46 |
return new Int32Rect(x, y, num2 - x, num4 - y); |
47 |
} |
48 |
|
49 |
[FileIOPermission(SecurityAction.LinkDemand)] |
50 |
public void Create(ICollection<Image> images, string destination) |
51 |
{ |
52 |
double num15; |
53 |
Rect rect; |
54 |
double num16; |
55 |
int num17; |
56 |
int num18; |
57 |
int num22; |
58 |
int num23; |
59 |
int num24; |
60 |
int num25; |
61 |
Rect rect3; |
62 |
int num26; |
63 |
int num27; |
64 |
EventHandler<StreamEventArgs> handler = null; |
65 |
EventHandler<StreamEventArgs> handler2 = null; |
66 |
EventHandler<StreamEventArgs> handler3 = null; |
67 |
EventHandler<StreamEventArgs> handler4 = null; |
68 |
BitmapTransformer transformer = new BitmapTransformer |
69 |
{ |
70 |
StripingEnabled = base.UseOptimizations |
71 |
}; |
72 |
bool useOptimizations = base.UseOptimizations; |
73 |
if (this.NoCaching) |
74 |
{ |
75 |
transformer.LargeFile = 0; |
76 |
} |
77 |
ImageFormat tileFormat = base.TileFormat; |
78 |
int finishedTiles = 0; |
79 |
int totalTiles = 0; |
80 |
foreach (Image image in images) |
81 |
{ |
82 |
Uri uri = new Uri(image.Path, UriKind.RelativeOrAbsolute); |
83 |
if (!uri.IsAbsoluteUri) |
84 |
{ |
85 |
image.Path = Path.GetFullPath(image.Path); |
86 |
} |
87 |
} |
88 |
if (base.HasInputNeededHandler()) |
89 |
{ |
90 |
if (handler == null) |
91 |
{ |
92 |
handler = (o, e) => base.OnInputNeeded(e); |
93 |
} |
94 |
transformer.InputNeeded += handler; |
95 |
} |
96 |
if (base.HasInputCompletedHandler()) |
97 |
{ |
98 |
if (handler2 == null) |
99 |
{ |
100 |
handler2 = (o, e) => base.OnInputCompleted(e); |
101 |
} |
102 |
transformer.InputCompleted += handler2; |
103 |
} |
104 |
if (base.HasOutputNeededHandler()) |
105 |
{ |
106 |
if (handler3 == null) |
107 |
{ |
108 |
handler3 = (o, e) => base.OnOutputNeeded(e); |
109 |
} |
110 |
transformer.OutputNeeded += handler3; |
111 |
} |
112 |
if (base.HasOutputCompletedHandler()) |
113 |
{ |
114 |
if (handler4 == null) |
115 |
{ |
116 |
handler4 = delegate(object o, StreamEventArgs e) |
117 |
{ |
118 |
finishedTiles++; |
119 |
e.Progress = ((double)finishedTiles) / ((double)totalTiles); |
120 |
this.OnOutputCompleted(e); |
121 |
}; |
122 |
} |
123 |
transformer.OutputCompleted += handler4; |
124 |
} |
125 |
transformer.CopyMetadata = this.CopyMetadata; |
126 |
if (string.IsNullOrEmpty(Path.GetExtension(destination))) |
127 |
{ |
128 |
destination = Path.ChangeExtension(destination, "xml"); |
129 |
} |
130 |
double num = 1.0; |
131 |
double num2 = 0.0; |
132 |
double num3 = 0.0; |
133 |
bool flag2 = false; |
134 |
foreach (Image image in images) |
135 |
{ |
136 |
if (image.ViewportWidth == 0.0) |
137 |
{ |
138 |
throw new ArgumentException("ViewportWidth cannot be 0:" + image.Path, "images"); |
139 |
} |
140 |
transformer.AddInput(image.Path); |
141 |
if (image.Size.X == 0.0) |
142 |
{ |
143 |
image.Size = transformer.GetPixelSize(image.Path); |
144 |
} |
145 |
if (image.Dpi.X == 0.0) |
146 |
{ |
147 |
Point dpi = transformer.GetDpi(image.Path); |
148 |
if ((dpi.X == 0.0) && (dpi.Y == 0.0)) |
149 |
{ |
150 |
image.Dpi = new Point(1.0, 1.0); |
151 |
} |
152 |
else |
153 |
{ |
154 |
image.Dpi = dpi; |
155 |
} |
156 |
} |
157 |
if (base.HasInputImageInfoHandler()) |
158 |
{ |
159 |
PixelFormat pixelFormat = transformer.GetPixelFormat(image.Path); |
160 |
ImageInfoEventArgs args = new ImageInfoEventArgs(image.Path, image.Size, image.Dpi, pixelFormat); |
161 |
base.OnInputImageInfo(args); |
162 |
} |
163 |
if (!(image.Dpi.X == image.Dpi.Y)) |
164 |
{ |
165 |
throw new ArgumentException("Image has different vertical DPI than horizontal DPI:" + image.Path, "images"); |
166 |
} |
167 |
if (!((flag2 || !(Path.GetExtension(image.Path) != ".jpg")) || transformer.IsOpaque(image.Path))) |
168 |
{ |
169 |
flag2 = true; |
170 |
} |
171 |
if (!this.userSelectedBkColor) |
172 |
{ |
173 |
if (flag2) |
174 |
{ |
175 |
this.backgroundColor = defaultAlphaBackgroundColor; |
176 |
} |
177 |
else |
178 |
{ |
179 |
this.backgroundColor = defaultOpaqueBackgroundColor; |
180 |
} |
181 |
} |
182 |
if (this.backgroundColor.A < 0xff) |
183 |
{ |
184 |
flag2 = true; |
185 |
} |
186 |
num3 += image.Size.X * image.Size.Y; |
187 |
double num4 = (1.0 / image.ViewportWidth) / image.Size.X; |
188 |
double num5 = (num4 * image.Dpi.X) / image.Dpi.Y; |
189 |
double num6 = num5 * image.Size.Y; |
190 |
double num7 = (-image.ViewportOrigin.Y / image.ViewportWidth) + num6; |
191 |
double num8 = Math.Max(Math.Min(num4, num5), 1.0 / image.MaxViewportWidth); |
192 |
num = Math.Min(num, num8); |
193 |
num2 = Math.Max(num2, num7); |
194 |
if ((((-image.ViewportOrigin.X + 1.0) / image.ViewportWidth) - 1.0) > 1E-10) |
195 |
{ |
196 |
throw new ArgumentException("Image out of bounds " + image.Path, "images"); |
197 |
} |
198 |
if ((image.ViewportOrigin.X > 0.0) || (image.ViewportOrigin.Y > 0.0)) |
199 |
{ |
200 |
throw new ArgumentException("Image out of bounds " + image.Path, "images"); |
201 |
} |
202 |
} |
203 |
if (tileFormat == ImageFormat.AutoSelect) |
204 |
{ |
205 |
if (images.Count == 1) |
206 |
{ |
207 |
IEnumerator<Image> enumerator = images.GetEnumerator(); |
208 |
enumerator.MoveNext(); |
209 |
try |
210 |
{ |
211 |
tileFormat = (ImageFormat)Enum.Parse(typeof(ImageFormat), Path.GetExtension(enumerator.Current.Path).Substring(1), true); |
212 |
} |
213 |
catch (Exception) |
214 |
{ |
215 |
} |
216 |
} |
217 |
if (tileFormat == ImageFormat.AutoSelect) |
218 |
{ |
219 |
if (flag2) |
220 |
{ |
221 |
tileFormat = ImageFormat.Png; |
222 |
} |
223 |
else |
224 |
{ |
225 |
tileFormat = ImageFormat.Jpg; |
226 |
} |
227 |
} |
228 |
} |
229 |
double num9 = Math.Round((double)(1.0 / num)); |
230 |
double num10 = Math.Round((double)(num2 / num)); |
231 |
int num11 = 0; |
232 |
int num12 = 0; |
233 |
if ((num9 > 2147483647.0) || (num10 > 2147483647.0)) |
234 |
{ |
235 |
Console.WriteLine(string.Concat(new object[] { "Warning: Maximum image size exceeded; Image would be ", num9, " by ", num10 })); |
236 |
Debug.WriteLine(string.Concat(new object[] { "Warning: Maximum image size exceeded; Image would be ", num9, " by ", num10 })); |
237 |
if (num9 > num10) |
238 |
{ |
239 |
num11 = (int)Math.Pow(2.0, (double)base.MaxLevel); |
240 |
num12 = (int)Math.Round((double)((num11 * num10) / num9)); |
241 |
} |
242 |
else |
243 |
{ |
244 |
num12 = (int)Math.Pow(2.0, 30.0); |
245 |
num11 = (int)Math.Round((double)((num12 * num9) / num10)); |
246 |
} |
247 |
Console.WriteLine(string.Concat(new object[] { "Image will be scaled to ", num11, " by ", num12 })); |
248 |
Debug.WriteLine(string.Concat(new object[] { "Image will be scaled to ", num11, " by ", num12 })); |
249 |
} |
250 |
else |
251 |
{ |
252 |
num11 = (int)num9; |
253 |
num12 = (int)num10; |
254 |
} |
255 |
int maxLevel = (int)Math.Ceiling(Math.Log((double)Math.Max(num11, num12), 2.0)); |
256 |
if (maxLevel > base.MaxLevel) |
257 |
{ |
258 |
num15 = Math.Pow(2.0, (double)(maxLevel - base.MaxLevel)); |
259 |
num11 = (int)Math.Ceiling((double)(((double)num11) / num15)); |
260 |
num12 = (int)Math.Ceiling((double)(((double)num12) / num15)); |
261 |
maxLevel = base.MaxLevel; |
262 |
} |
263 |
bool flag3 = false; |
264 |
foreach (Image image in images) |
265 |
{ |
266 |
rect = ImageToRect(num11, num12, image); |
267 |
num16 = Math.Max(image.Dpi.X, image.Dpi.Y); |
268 |
num17 = maxLevel - ((int)Math.Floor(Math.Log(((rect.Width / image.Size.X) * image.Dpi.X) / num16, 2.0))); |
269 |
num18 = maxLevel + ((int)Math.Floor(Math.Log(image.MaxViewportWidth / ((double)num11), 2.0))); |
270 |
Debug.WriteLine(string.Concat(new object[] { image.Path, ",", num18, ",", num17 })); |
271 |
if (num18 > 500) |
272 |
{ |
273 |
num18 = num17; |
274 |
} |
275 |
else if (num18 == num17) |
276 |
{ |
277 |
num18 = num17 + 1; |
278 |
} |
279 |
else if (num18 > num17) |
280 |
{ |
281 |
throw new ArgumentException("MaxViewportWidth exteds beyond the supported value. image:" + image.Path); |
282 |
} |
283 |
if ((num18 > maxLevel) && (num18 <= base.MaxLevel)) |
284 |
{ |
285 |
flag3 = true; |
286 |
} |
287 |
} |
288 |
if (flag3) |
289 |
{ |
290 |
num15 = Math.Pow(2.0, (double)(maxLevel - base.MaxLevel)); |
291 |
num9 = Math.Ceiling((double)(num11 * 2.0)); |
292 |
num10 = Math.Ceiling((double)(num12 * 2.0)); |
293 |
if ((num9 > 2147483647.0) || (num10 > 2147483647.0)) |
294 |
{ |
295 |
throw new ArgumentException("MaxViewportWidth forces a unsupported images size"); |
296 |
} |
297 |
num11 = (int)num9; |
298 |
num12 = (int)num10; |
299 |
maxLevel = (int)Math.Ceiling(Math.Log((double)Math.Max(num11, num12), 2.0)); |
300 |
if (maxLevel > base.MaxLevel) |
301 |
{ |
302 |
throw new ArgumentException("MaxViewportWidth forces a unsupported images size"); |
303 |
} |
304 |
} |
305 |
Debug.WriteLine(string.Concat(new object[] { "Image size:", num11, " ", num12, " ", maxLevel })); |
306 |
Debug.WriteLine(images.Count + " inputs, total pixels: " + num3); |
307 |
string str = base.CreateDirectories(destination, maxLevel); |
308 |
List<RectCollection> list = new List<RectCollection>(maxLevel); |
309 |
List<RectCollection> list2 = new List<RectCollection>(maxLevel); |
310 |
for (int i = 0; i <= maxLevel; i++) |
311 |
{ |
312 |
list.Add(new RectCollection()); |
313 |
list2.Add(new RectCollection()); |
314 |
} |
315 |
int num20 = this.FindSingleTileLevel(num11, num12, maxLevel) + 1; |
316 |
int num21 = num20; |
317 |
if (maxLevel < num21) |
318 |
{ |
319 |
useOptimizations = false; |
320 |
} |
321 |
num20 = Math.Min(num20, maxLevel); |
322 |
foreach (Image image in images) |
323 |
{ |
324 |
rect = ImageToRect(num11, num12, image); |
325 |
num16 = Math.Max(image.Dpi.X, image.Dpi.Y); |
326 |
num17 = maxLevel - ((int)Math.Floor(Math.Log(((rect.Width / image.Size.X) * image.Dpi.X) / num16, 2.0))); |
327 |
num18 = maxLevel + ((int)Math.Floor(Math.Log(image.MaxViewportWidth / ((double)num11), 2.0))); |
328 |
if ((num18 < maxLevel) && (num18 < num20)) |
329 |
{ |
330 |
useOptimizations = false; |
331 |
} |
332 |
else |
333 |
{ |
334 |
num22 = maxLevel + ((int)Math.Ceiling(Math.Log(image.MinViewportWidth / ((double)num11), 2.0))); |
335 |
if (num22 > 0) |
336 |
{ |
337 |
useOptimizations = false; |
338 |
} |
339 |
} |
340 |
Debug.WriteLine(string.Concat(new object[] { image.Path, ",", num18, ",", num17 })); |
341 |
if (num18 > 500) |
342 |
{ |
343 |
num18 = num17; |
344 |
} |
345 |
else if (num18 <= num17) |
346 |
{ |
347 |
num18++; |
348 |
} |
349 |
else if (num18 > num17) |
350 |
{ |
351 |
throw new ArgumentException("MaxViewportWidth exteds beyond the supported value. image:" + image.Path); |
352 |
} |
353 |
num18 = Math.Min(maxLevel, num18); |
354 |
Int32Rect toAdd = BitmapTransformer.RectToInt32Rect(rect); |
355 |
for (num23 = num20; num23 <= num18; num23++) |
356 |
{ |
357 |
list2[num23].Add(ref toAdd); |
358 |
num15 = Math.Pow(2.0, (double)(maxLevel - num23)); |
359 |
num24 = (int)Math.Ceiling((double)(((double)num11) / num15)); |
360 |
num25 = (int)Math.Ceiling((double)(((double)num12) / num15)); |
361 |
rect3 = rect; |
362 |
rect3.Scale(((double)num24) / ((double)num11), ((double)num25) / ((double)num12)); |
363 |
if ((rect3.Bottom > num25) && (rect3.Bottom < (num25 + 0.5))) |
364 |
{ |
365 |
rect3.Height = num25 - rect3.Top; |
366 |
} |
367 |
if ((rect3.Right > num24) && (rect3.Right < (num24 + 0.5))) |
368 |
{ |
369 |
rect3.Width = num24 - rect3.Left; |
370 |
} |
371 |
Int32Rect rect4 = this.ComputeTileRect(ref rect3); |
372 |
list[num23].Add(ref rect4); |
373 |
} |
374 |
} |
375 |
if (useOptimizations) |
376 |
{ |
377 |
num15 = Math.Pow(2.0, (double)(maxLevel - num21)); |
378 |
num26 = (int)Math.Ceiling((double)(((double)num11) / num15)); |
379 |
num27 = (int)Math.Ceiling((double)(((double)num12) / num15)); |
380 |
int num28 = (int)Math.Ceiling((double)(((double)num26) / ((double)this.TileSize))); |
381 |
int height = (int)Math.Ceiling((double)(((double)num27) / ((double)this.TileSize))); |
382 |
Int32Rect rect5 = new Int32Rect(0, 0, num28, height); |
383 |
if (!((list[num21].Rects.Count != 0) && list[num21].Rects[0].Equals(rect5))) |
384 |
{ |
385 |
useOptimizations = false; |
386 |
} |
387 |
} |
388 |
if (!useOptimizations) |
389 |
{ |
390 |
Int32Rect rect6 = new Int32Rect(0, 0, 1, 1); |
391 |
for (int i = 0; i < num20; i++) |
392 |
{ |
393 |
list[i].Add(ref rect6); |
394 |
} |
395 |
} |
396 |
num23 = 0; |
397 |
while (num23 <= maxLevel) |
398 |
{ |
399 |
foreach (Int32Rect rect4 in list[num23].Rects) |
400 |
{ |
401 |
totalTiles += rect4.Width * rect4.Height; |
402 |
} |
403 |
num23++; |
404 |
} |
405 |
if (useOptimizations) |
406 |
{ |
407 |
totalTiles += num20; |
408 |
} |
409 |
if (base.HasOutputInfoHandler()) |
410 |
{ |
411 |
OutputInfoEventArgs args2 = new OutputInfoEventArgs(destination, new Point((double)num11, (double)num12), new Point(96.0, 96.0), transformer.ChoosePixelFormat(tileFormat), tileFormat, maxLevel, totalTiles); |
412 |
base.OnOutputInfo(args2); |
413 |
} |
414 |
|
415 |
if (this.CopyMetadata) |
416 |
{ |
417 |
|
418 |
XElement element = new XElement((XName)(DZTCommon.DeepZoomNamespace + "Size"), new object[] { new XAttribute("Width", num11), new XAttribute("Height", num12) }); |
419 |
XElement element2 = new XElement((XName)(DZTCommon.DeepZoomNamespace + "Image"), new object[] { new XAttribute("TileSize", this.TileSize), new XAttribute("Overlap", base.TileOverlap), new XAttribute("Format", tileFormat.ToString().ToLowerInvariant()), new XAttribute("ServerFormat", this.ServerFormatXML.ToString()), element }); |
420 |
if (images.Count > 1) |
421 |
{ |
422 |
Int32Rect rect7 = new Int32Rect(0, 0, num11, num12); |
423 |
while ((num20 < maxLevel) && (list2[num20 + 1].Rects[0] == rect7)) |
424 |
{ |
425 |
num20++; |
426 |
} |
427 |
if ((num20 + 1) < maxLevel) |
428 |
{ |
429 |
List<XElement> content = new List<XElement> { |
430 |
CreateDisplayRect(0, num20, 0, 0, num11, num12) |
431 |
}; |
432 |
for (int i = num20 + 1; i <= maxLevel; i++) |
433 |
{ |
434 |
foreach (Int32Rect rect2 in list2[i].Rects) |
435 |
{ |
436 |
content.Add(CreateDisplayRect(i, i, rect2.X, rect2.Y, rect2.Width, rect2.Height)); |
437 |
} |
438 |
} |
439 |
element2.Add(new XElement((XName)(DZTCommon.DeepZoomNamespace + "DisplayRects"), content)); |
440 |
} |
441 |
} |
442 |
StreamEventArgs args3 = new StreamEventArgs(destination) |
443 |
{ |
444 |
MimeType = "application/xml", |
445 |
Compress = true |
446 |
}; |
447 |
if (base.HasOutputNeededHandler()) |
448 |
{ |
449 |
base.OnOutputNeeded(args3); |
450 |
using (StreamWriter writer = new StreamWriter(args3.Stream)) |
451 |
{ |
452 |
element2.Save(writer, SaveOptions.DisableFormatting); |
453 |
writer.Flush(); |
454 |
} |
455 |
} |
456 |
else |
457 |
{ |
458 |
element2.Save(destination, SaveOptions.DisableFormatting); |
459 |
} |
460 |
if (base.HasOutputCompletedHandler()) |
461 |
{ |
462 |
base.OnOutputCompleted(args3); |
463 |
} |
464 |
element = null; |
465 |
element2 = null; |
466 |
list2 = null; |
467 |
} |
468 |
|
469 |
|
470 |
transformer.OutputAlpha = flag2; |
471 |
string str2 = "." + tileFormat.ToString().ToLowerInvariant(); |
472 |
int width = this.TileSize + (2 * base.TileOverlap); |
473 |
int num31 = num21; |
474 |
if (!useOptimizations) |
475 |
{ |
476 |
num31 = 0; |
477 |
} |
478 |
for (num23 = maxLevel; num23 >= num31; num23--) |
479 |
{ |
480 |
bool flag4; |
481 |
if (useOptimizations && (num23 == num21)) |
482 |
{ |
483 |
flag4 = true; |
484 |
} |
485 |
else |
486 |
{ |
487 |
flag4 = false; |
488 |
} |
489 |
num15 = Math.Pow(2.0, (double)(maxLevel - num23)); |
490 |
num24 = (int)Math.Ceiling((double)(((double)num11) / num15)); |
491 |
num25 = (int)Math.Ceiling((double)(((double)num12) / num15)); |
492 |
Int32Rect b = new Int32Rect(0, 0, num24, num25); |
493 |
string str3 = Path.Combine(str, num23.ToString(CultureInfo.InvariantCulture)) + Path.DirectorySeparatorChar; |
494 |
foreach (Int32Rect rect4 in list[num23].Rects) |
495 |
{ |
496 |
int x; |
497 |
Int32Rect rect9; |
498 |
Rect rect10; |
499 |
string str4; |
500 |
int y = rect4.Y; |
501 |
while (y < (rect4.Y + rect4.Height)) |
502 |
{ |
503 |
x = rect4.X; |
504 |
while (x < (rect4.X + rect4.Width)) |
505 |
{ |
506 |
rect9 = new Int32Rect((x * this.TileSize) - base.TileOverlap, (y * this.TileSize) - base.TileOverlap, width, width); |
507 |
rect9 = Int32RectIntersect(rect9, b); |
508 |
rect10 = BitmapTransformer.Int32RectToRect(rect9); |
509 |
str4 = str3 + x.ToString(CultureInfo.InvariantCulture) + "_" + y.ToString(CultureInfo.InvariantCulture) + str2; |
510 |
transformer.AddOutput(str4, rect9.Width, rect9.Height, base.ImageQuality, tileFormat, this.BackgroundColor, flag4); |
511 |
x++; |
512 |
} |
513 |
y++; |
514 |
} |
515 |
foreach (Image image in images) |
516 |
{ |
517 |
num22 = maxLevel + ((int)Math.Ceiling(Math.Log(image.MinViewportWidth / ((double)num11), 2.0))); |
518 |
num18 = maxLevel + ((int)Math.Floor(Math.Log(image.MaxViewportWidth / ((double)num11), 2.0))); |
519 |
if ((num23 >= num22) && (num23 <= num18)) |
520 |
{ |
521 |
rect = ImageToRect(num11, num12, image); |
522 |
num16 = Math.Max(image.Dpi.X, image.Dpi.Y); |
523 |
Point point2 = new Point((image.Size.X / image.Dpi.X) * num16, (image.Size.Y / image.Dpi.Y) * num16); |
524 |
rect3 = rect; |
525 |
rect3.Scale(((double)num24) / ((double)num11), ((double)num25) / ((double)num12)); |
526 |
if (DoesInt32RectIntersect(this.ComputeTileRect(ref rect3), rect4)) |
527 |
{ |
528 |
for (y = rect4.Y; y < (rect4.Y + rect4.Height); y++) |
529 |
{ |
530 |
for (x = rect4.X; x < (rect4.X + rect4.Width); x++) |
531 |
{ |
532 |
rect9 = new Int32Rect((x * this.TileSize) - base.TileOverlap, (y * this.TileSize) - base.TileOverlap, width, width); |
533 |
rect9 = Int32RectIntersect(rect9, b); |
534 |
Rect rect12 = BitmapTransformer.Int32RectToRect(rect9); |
535 |
rect10 = Rect.Intersect(rect12, rect3); |
536 |
if (!rect10.IsEmpty) |
537 |
{ |
538 |
str4 = str3 + x.ToString(CultureInfo.InvariantCulture) + "_" + y.ToString(CultureInfo.InvariantCulture) + str2; |
539 |
rect10.Offset((double)-rect9.X, (double)-rect9.Y); |
540 |
rect12.Scale(((double)num11) / ((double)num24), ((double)num12) / ((double)num25)); |
541 |
rect12.Intersect(rect); |
542 |
rect12.Offset(-rect.X, -rect.Y); |
543 |
rect12.Scale(point2.X / rect.Width, point2.Y / rect.Height); |
544 |
transformer.AddTransformation(image.Path, str4, rect12, rect10); |
545 |
} |
546 |
} |
547 |
} |
548 |
} |
549 |
} |
550 |
} |
551 |
transformer.Execute(); |
552 |
} |
553 |
foreach (Image image in images) |
554 |
{ |
555 |
num18 = maxLevel + ((int)Math.Ceiling(Math.Log(image.MaxViewportWidth / ((double)num11), 2.0))); |
556 |
if (num23 == num18) |
557 |
{ |
558 |
transformer.CloseInput(image.Path); |
559 |
} |
560 |
} |
561 |
GC.Collect(2); |
562 |
GC.Collect(2); |
563 |
} |
564 |
transformer.CloseAllInputs(); |
565 |
GC.Collect(2); |
566 |
GC.Collect(2); |
567 |
if (useOptimizations) |
568 |
{ |
569 |
string str8; |
570 |
Rect rect15; |
571 |
int num34 = num21; |
572 |
int num35 = num34 - 1; |
573 |
string str5 = Path.Combine(str, num35.ToString(CultureInfo.InvariantCulture)) + Path.DirectorySeparatorChar; |
574 |
string str6 = Path.Combine(str, num34.ToString(CultureInfo.InvariantCulture)) + Path.DirectorySeparatorChar; |
575 |
string fileName = str5 + "0_0" + str2; |
576 |
num15 = Math.Pow(2.0, (double)(maxLevel - num34)); |
577 |
num26 = (int)Math.Ceiling((double)(((double)num11) / num15)); |
578 |
num27 = (int)Math.Ceiling((double)(((double)num12) / num15)); |
579 |
num15 = Math.Pow(2.0, (double)(maxLevel - num35)); |
580 |
int num36 = (int)Math.Ceiling((double)(((double)num11) / num15)); |
581 |
int num37 = (int)Math.Ceiling((double)(((double)num12) / num15)); |
582 |
Int32Rect rect13 = new Int32Rect(0, 0, num26, num27); |
583 |
transformer.AddOutput(fileName, num36, num37, base.ImageQuality, tileFormat, this.BackgroundColor, true); |
584 |
int tileOverlap = 0; |
585 |
for (int i = 0; i < num27; i += this.TileSize) |
586 |
{ |
587 |
int tileSize = this.TileSize; |
588 |
if ((i + tileSize) > num27) |
589 |
{ |
590 |
tileSize = num27 % this.TileSize; |
591 |
} |
592 |
int num41 = 0; |
593 |
for (int j = 0; j < num26; j += this.TileSize) |
594 |
{ |
595 |
string[] strArray = new string[5]; |
596 |
strArray[0] = str6; |
597 |
int num44 = j / this.TileSize; |
598 |
strArray[1] = num44.ToString(); |
599 |
strArray[2] = "_"; |
600 |
strArray[3] = (i / this.TileSize).ToString(); |
601 |
strArray[4] = str2; |
602 |
str8 = string.Concat(strArray); |
603 |
transformer.AddOutputAsInput(str8); |
604 |
int num43 = this.TileSize; |
605 |
if ((j + num43) > num26) |
606 |
{ |
607 |
num43 = num26 % this.TileSize; |
608 |
} |
609 |
Rect rect14 = new Rect((double)num41, (double)tileOverlap, (double)num43, (double)tileSize); |
610 |
num41 = base.TileOverlap; |
611 |
rect15 = new Rect(Math.Ceiling((double)(((double)j) / 2.0)), Math.Ceiling((double)(((double)i) / 2.0)), Math.Ceiling((double)(((double)num43) / 2.0)), Math.Ceiling((double)(((double)tileSize) / 2.0))); |
612 |
if ((rect15.Width + rect15.X) > num36) |
613 |
{ |
614 |
rect15.Width = num36 - rect15.X; |
615 |
} |
616 |
if ((rect15.Height + rect15.Y) > num37) |
617 |
{ |
618 |
rect15.Height = num37 - rect15.Y; |
619 |
} |
620 |
transformer.AddTransformation(str8, fileName, rect14, rect15); |
621 |
} |
622 |
tileOverlap = base.TileOverlap; |
623 |
} |
624 |
transformer.Execute(); |
625 |
Rect inputRect = new Rect(0.0, 0.0, (double)num36, (double)num37); |
626 |
str8 = fileName; |
627 |
transformer.AddOutputAsInput(str8); |
628 |
num35--; |
629 |
|
630 |
// 7레벨 이하 저장 |
631 |
if(!this.LowLevelPass) |
632 |
while (num35 >= 0) |
633 |
{ |
634 |
fileName = (Path.Combine(str, num35.ToString(CultureInfo.InvariantCulture)) + Path.DirectorySeparatorChar) + "0_0" + str2; |
635 |
num15 = Math.Pow(2.0, (double)(maxLevel - num35)); |
636 |
num36 = (int)Math.Ceiling((double)(((double)num11) / num15)); |
637 |
num37 = (int)Math.Ceiling((double)(((double)num12) / num15)); |
638 |
rect15 = new Rect(0.0, 0.0, (double)num36, (double)num37); |
639 |
transformer.AddOutput(fileName, num36, num37, base.ImageQuality, tileFormat, this.BackgroundColor, false); |
640 |
transformer.AddTransformation(str8, fileName, inputRect, rect15); |
641 |
transformer.Execute(); |
642 |
num35--; |
643 |
} |
644 |
} |
645 |
transformer.CleanUp(); |
646 |
GC.Collect(2); |
647 |
GC.Collect(2); |
648 |
} |
649 |
|
650 |
private static XElement CreateDisplayRect(int minLevel, int maxLevel, int x, int y, int width, int height) |
651 |
{ |
652 |
XElement element = new XElement((XName)(DZTCommon.DeepZoomNamespace + "Rect"), new object[] { new XAttribute("X", x), new XAttribute("Y", y), new XAttribute("Width", width), new XAttribute("Height", height) }); |
653 |
return new XElement((XName)(DZTCommon.DeepZoomNamespace + "DisplayRect"), new object[] { new XAttribute("MinLevel", minLevel), new XAttribute("MaxLevel", maxLevel), element }); |
654 |
} |
655 |
|
656 |
private static bool DoesInt32RectIntersect(Int32Rect a, Int32Rect b) |
657 |
{ |
658 |
return (((((b.X + b.Width) >= a.X) && (b.X <= (a.X + a.Width))) && ((b.Y + b.Height) >= a.Y)) && (b.Y <= (a.Y + a.Height))); |
659 |
} |
660 |
|
661 |
private int FindSingleTileLevel(int width, int height, int level) |
662 |
{ |
663 |
double num = Math.Max(width, height); |
664 |
while (((int)Math.Ceiling((double)(num / ((double)this.TileSize)))) > 1) |
665 |
{ |
666 |
num /= 2.0; |
667 |
level--; |
668 |
} |
669 |
return level; |
670 |
} |
671 |
|
672 |
private static Rect ImageToRect(int fullWidth, int fullHeight, Image image) |
673 |
{ |
674 |
double num = -image.ViewportOrigin.X / image.ViewportWidth; |
675 |
double num2 = -image.ViewportOrigin.Y / image.ViewportWidth; |
676 |
double num3 = 1.0 / image.ViewportWidth; |
677 |
double num4 = Math.Max(image.Dpi.X, image.Dpi.Y); |
678 |
Point point = new Point(((image.Size.X / image.Dpi.X) / 96.0) * num4, ((image.Size.Y / image.Dpi.Y) / 96.0) * num4); |
679 |
double num5 = (num3 * point.Y) / point.X; |
680 |
Rect rect = new Rect(num * fullWidth, num2 * fullWidth, num3 * fullWidth, num5 * fullWidth); |
681 |
if (rect.Bottom > fullHeight) |
682 |
{ |
683 |
rect.Height = fullHeight - rect.Top; |
684 |
} |
685 |
return rect; |
686 |
} |
687 |
|
688 |
private static Int32Rect Int32RectIntersect(Int32Rect a, Int32Rect b) |
689 |
{ |
690 |
if (DoesInt32RectIntersect(a, b)) |
691 |
{ |
692 |
int x = Math.Max(a.X, b.X); |
693 |
int y = Math.Max(a.Y, b.Y); |
694 |
int num3 = Math.Min((int)(a.X + a.Width), (int)(b.X + b.Width)); |
695 |
int num4 = Math.Min((int)(a.Y + a.Height), (int)(b.Y + b.Height)); |
696 |
return new Int32Rect(x, y, num3 - x, num4 - y); |
697 |
} |
698 |
return new Int32Rect(0, 0, 0, 0); |
699 |
} |
700 |
|
701 |
// Properties |
702 |
public Color BackgroundColor |
703 |
{ |
704 |
get |
705 |
{ |
706 |
return this.backgroundColor; |
707 |
} |
708 |
set |
709 |
{ |
710 |
this.backgroundColor = value; |
711 |
this.userSelectedBkColor = true; |
712 |
} |
713 |
} |
714 |
|
715 |
public bool CopyMetadata |
716 |
{ |
717 |
get |
718 |
{ |
719 |
return this.copyMetadata; |
720 |
} |
721 |
set |
722 |
{ |
723 |
this.copyMetadata = value; |
724 |
} |
725 |
} |
726 |
|
727 |
public bool NoCaching { get; set; } |
728 |
|
729 |
public ServerFormats ServerFormat |
730 |
{ |
731 |
get |
732 |
{ |
733 |
return base.ServerFormat; |
734 |
} |
735 |
set |
736 |
{ |
737 |
if (value == ServerFormats.SmoothStreaming) |
738 |
{ |
739 |
throw new NotSupportedException("Smooth Streaming is not supported for Sparse Images"); |
740 |
} |
741 |
} |
742 |
} |
743 |
|
744 |
internal ServerFormats ServerFormatXML { get; set; } |
745 |
} |
746 |
|
747 |
|
748 |
} |