コード例 #1
0
 public static NSData ToNSData(this Image image, Imaging.ImageFormat format)
 {
     using (var stream = new IO.MemoryStream()) {
         image.Save(stream, format);
         return(NSData.FromArray(stream.ToArray()));
     }
 }
コード例 #2
0
        private ImageDimensions CalculateImageDimensions(
            Imaging.ImageFormat format,
            PixelStorageOptions storageOptions,
            ImageDimensions embeddedImageDimensions,
            long totalBytes,
            out int imageRepeats)
        {
            imageRepeats = 1;

            int bitsPerPixel = storageOptions == null
                ? format.BytesPerPixel * 8
                : storageOptions.BitsPerPixel;
            long pixelsRequired = (long)Math.Ceiling(totalBytes / (bitsPerPixel / 8.0));

            int frames;

            if (!format.SupportsFrames)
            {
                frames = 1;
            }
            else if (embeddedImageDimensions != null)
            {
                frames = embeddedImageDimensions.Frames ?? 1;
            }
            else
            {
                frames = (int)Math.Ceiling(pixelsRequired / Math.Pow(ImageWidthFrameThreshold, 2));
            }

            int imageWidth;
            int imageHeight;

            if (embeddedImageDimensions != null)
            {
                imageWidth  = embeddedImageDimensions.Width;
                imageHeight = embeddedImageDimensions.Height;
            }
            else
            {
                imageWidth  = (int)Math.Floor(Math.Sqrt(pixelsRequired / frames));
                imageHeight = (int)(pixelsRequired / (imageWidth * frames));
            }

            while (Math.BigMul(imageHeight, (int)Math.Floor(imageWidth * (bitsPerPixel / 8.0) * frames)) <= totalBytes)
            {
                if (format.SupportsFrames)
                {
                    imageRepeats++;
                    frames += (embeddedImageDimensions != null ? embeddedImageDimensions.Frames : null) ?? 1;
                }
                else
                {
                    imageHeight++;
                }
            }

            return(new ImageDimensions(format.SupportsFrames ? frames : (int?)null, imageWidth, imageHeight));
        }
コード例 #3
0
        protected virtual async Task <Stream> CreateImageWriterStreamAsync(ImageConfiguration configuration, Stream output, long totalBytes)
        {
            Imaging.ImageFormat imageFormat  = ImageFormatFactory.GetFormat(configuration.Format);
            ImageOptions        imageOptions = GenerateImageOptions(configuration, imageFormat, CalculateImageDimensions(imageFormat, totalBytes));

            Stream imageStream = imageFormat.CreateWriter(imageOptions).CreateOutputStream(output, true, EncodingConfiguration.BufferSize);

            await WriteHeaderAsync(imageStream);

            return(imageStream);
        }
コード例 #4
0
        private ImageDimensions CalculateImageDimensions(Imaging.ImageFormat format, long totalBytes)
        {
            long pixelsRequired = (long)Math.Ceiling((double)totalBytes / format.BytesPerPixel);

            int frames = format.SupportsFrames ? (int)Math.Ceiling(pixelsRequired / Math.Pow(ImageWidthFrameThreshold, 2)) : 1;

            int imageWidth  = (int)Math.Floor(Math.Sqrt(pixelsRequired / frames));
            var imageHeight = (int)(pixelsRequired / (imageWidth * frames));

            while (Math.BigMul(imageHeight, (int)Math.Floor((double)imageWidth * format.BytesPerPixel * frames)) <= totalBytes)
            {
                imageHeight++;
            }

            return(new ImageDimensions(format.SupportsFrames ? frames : (int?)null, imageWidth, imageHeight));
        }
コード例 #5
0
        protected override async Task <Stream> CreateImageWriterStreamAsync(ImageConfiguration configuration, Stream output, long totalBytes)
        {
            Imaging.ImageFormat imageFormat = ImageFormatFactory.GetFormat(configuration.Format);

            var pixelStorageSerializer = new PixelStorageOptionsSerializer();

            totalBytes += pixelStorageSerializer.CalculateStorageLength(imageFormat);

            ImageDimensions     embeddedImageDimensions = null;
            PixelStorageOptions pixelStorageOptions;
            Stream embeddedImageStream = null;

            if (configuration.HasEmbeddedImage)
            {
                embeddedImageDimensions = new ImageDimensions(configuration.EmbeddedImage.Image);
                pixelStorageOptions     = _pixelStorageCalculator.CalculatePixelStorageOptions(
                    imageFormat,
                    configuration.EmbeddedImage.EmbeddedPixelStorage,
                    embeddedImageDimensions,
                    totalBytes);

                embeddedImageStream = imageFormat.LoadPixelDataStream(configuration.EmbeddedImage.Image);
            }
            else
            {
                pixelStorageOptions = imageFormat.PixelStorageWithBitsPerChannel(
                    8,
                    PixelStorageOptions.BitStorageMode.MostSignificantBits);
            }

            byte[] pixelStorageBytes = await pixelStorageSerializer.SerializeToBytesAsync(pixelStorageOptions);

            int embeddedImageRepeats;

            ImageOptions imageOptions = GenerateImageOptions(
                configuration,
                imageFormat,
                CalculateImageDimensions(imageFormat, pixelStorageOptions, embeddedImageDimensions, totalBytes, out embeddedImageRepeats));

            Stream imageStream = imageFormat.CreateWriter(imageOptions).CreateOutputStream(output, true, EncodingConfiguration.BufferSize);

            await WriteHeaderAsync(imageStream);

            await imageStream.WriteAsync(pixelStorageBytes, 0, pixelStorageBytes.Length);

            if (configuration.HasEmbeddedImage)
            {
                var repeatingImageStream = new RepeatingStream(embeddedImageStream, embeddedImageRepeats);
                return(new PixelStorageWriterStream(
                           imageStream,
                           new SubStream(
                               repeatingImageStream,
                               imageStream.Position,
                               repeatingImageStream.Length - repeatingImageStream.Position - imageStream.Position),
                           pixelStorageOptions,
                           leaveOpen: false,
                           bufferSize: EncodingConfiguration.BufferSize));
            }

            return(imageStream);
        }
コード例 #6
0
ファイル: Bitmap.cs プロジェクト: ststeiger/nrtftree
 public void Save(string path, Imaging.ImageFormat format)
 {
 }