private static BitmapEncoder GetBitmapEncoder(ImageContentType imageContentType) { BitmapEncoder bitmapEncoder; switch (imageContentType) { case ImageContentType.ImageBmpContentType: bitmapEncoder = new BmpBitmapEncoder(); break; case ImageContentType.ImageGifContentType: bitmapEncoder = new GifBitmapEncoder(); break; case ImageContentType.ImageJpegContentType: bitmapEncoder = new JpegBitmapEncoder(); break; case ImageContentType.ImageTiffContentType: bitmapEncoder = new TiffBitmapEncoder(); break; case ImageContentType.ImagePngContentType: bitmapEncoder = new PngBitmapEncoder(); break; default: bitmapEncoder = new PngBitmapEncoder(); break; } return bitmapEncoder; }
// Generates a image part Uri for the given image index private static string GetImageName(int imageIndex, ImageContentType imageContentType) { string imageFileExtension = GetImageFileExtension(imageContentType); return XamlImageName + (imageIndex + 1) + imageFileExtension; }
private static string GetImageContentName(ImageContentType imageContentType) { return ImageContentTypeName[(int)imageContentType]; }
// Returns a file extension corresponding to a given imageContentType private static string GetImageFileExtension(ImageContentType imageContentType) { return ImageFileExtension[(int)imageContentType]; }
internal static Stream SaveImage(BitmapSource bitmapSource, ImageContentType imageContentType) { MemoryStream stream = new MemoryStream(); // Create the wpf package in the stream WpfPayload wpfPayload = new WpfPayload(); using (wpfPayload.CreatePackage(stream)) { PackagePart xamlEntryPart = wpfPayload.CreateWpfEntryPart(); Stream xamlPartStream = xamlEntryPart.GetStream(); using (xamlPartStream) { // int imageIndex = 0; imageIndex++; string imageReference = GetImageReference(GetImageName(imageIndex, imageContentType)); StreamWriter xamlPartWriter = new StreamWriter(xamlPartStream); using (xamlPartWriter) { string xamlText = "<Span xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\">" + "<InlineUIContainer><Image " + "Width=\"" + bitmapSource.Width + "\" " + "Height=\"" + bitmapSource.Height + "\" " + "><Image.Source><BitmapImage CacheOption=\"OnLoad\" UriSource=\"" + imageReference + "\"/></Image.Source></Image></InlineUIContainer></Span>"; xamlPartWriter.Write(xamlText); } wpfPayload.CreateImagePart(xamlEntryPart, bitmapSource, imageContentType, imageIndex); } } return stream; }
private void CreateImagePart(PackagePart sourcePart, BitmapSource imageSource, ImageContentType imageContentType, int imageIndex) { // Generate a new unique image part name string imagePartUriString = GetImageName(imageIndex, imageContentType); // Define an image part uri Uri imagePartUri = new Uri(XamlPayloadDirectory + imagePartUriString, UriKind.Relative); // Create a part for the image PackagePart imagePart = _package.CreatePart(imagePartUri, GetImageContentName(imageContentType), CompressionOption.NotCompressed); // Create the relationship referring from the enrty part to the image part PackageRelationship componentRelationship = sourcePart.CreateRelationship(imagePartUri, TargetMode.Internal, XamlRelationshipFromXamlPartToComponentPart); // Encode the image data BitmapEncoder bitmapEncoder = GetBitmapEncoder(imageContentType); bitmapEncoder.Frames.Add(BitmapFrame.Create(imageSource)); // Save encoded image data into the image part in the package Stream imageStream = imagePart.GetStream(); using (imageStream) { bitmapEncoder.Save(imageStream); } }
/// <summary> /// Commands the insert image. /// </summary> /// <param name="image">The image.</param> /// <param name="contnt_type">The contnt_type.</param> /// <param name="stretch">The stretch.</param> public void cmdInsertImage( BitmapSource image, ImageContentType contnt_type = ImageContentType.ImagePngContentType, Stretch stretch = Stretch.Uniform) { Span element = YATEHelper.GetImage(image, contnt_type, stretch); if (element == null) return; Image i = YATEHelper.ImageFromSpan(element); YATEHelper.AdjustWidth(i, this.PageWidth); i.Stretch = stretch; cmdInsertInline(element as Span); }