Пример #1
0
        internal static void GmicImageListAdd(SafeGmicImageList list,
                                              uint width,
                                              uint height,
                                              GmicPixelFormat format,
                                              string name,
                                              out GmicImageListPixelData pixelData,
                                              out NativeImageFormat nativeImageFormat)
        {
            ValidateGmicImageList(list);

            pixelData         = new GmicImageListPixelData();
            nativeImageFormat = ConvertToNativeImageFormat(format);

            GmicStatus status = GmicNativeMethods.Instance.GmicImageListAdd(list,
                                                                            width,
                                                                            height,
                                                                            nativeImageFormat,
                                                                            string.IsNullOrWhiteSpace(name) ? null : name,
                                                                            pixelData);

            if (status != GmicStatus.Ok)
            {
                HandleError(status);
            }
        }
Пример #2
0
        private static NativeImageFormat ConvertToNativeImageFormat(GmicPixelFormat format)
        {
            switch (format)
            {
            case GmicPixelFormat.Gray8:
                return(NativeImageFormat.Gray8);

            case GmicPixelFormat.GrayAlpha16:
                return(NativeImageFormat.GrayAlpha88);

            case GmicPixelFormat.Rgb24:
                return(NativeImageFormat.Rgb888);

            case GmicPixelFormat.Rgba32:
                return(NativeImageFormat.Rgba8888);

            default:
                throw new InvalidEnumArgumentException(nameof(format), (int)format, typeof(GmicPixelFormat));
            }
        }
        /// <summary>
        /// Creates a <see cref="GdiPlusGmicBitmap"/> from specified output image information.
        /// </summary>
        /// <param name="width">The output image width.</param>
        /// <param name="height">The output image height.</param>
        /// <param name="gmicPixelFormat">The output image G'MIC pixel format.</param>
        /// <returns>The created bitmap.</returns>
        public GdiPlusGmicBitmap Create(int width, int height, GmicPixelFormat gmicPixelFormat)
        {
            PixelFormat format;

            switch (gmicPixelFormat)
            {
            case GmicPixelFormat.Gray8:
            case GmicPixelFormat.Rgb24:
                format = PixelFormat.Format24bppRgb;
                break;

            case GmicPixelFormat.GrayAlpha16:
            case GmicPixelFormat.Rgba32:
                format = PixelFormat.Format32bppArgb;
                break;

            default:
                throw new InvalidOperationException($"Unsupported { nameof(GmicPixelFormat) } value: { gmicPixelFormat }.");
            }

            return(new GdiPlusGmicBitmap(width, height, format));
        }
Пример #4
0
        /// <summary>
        /// Adds the specified bitmap.
        /// </summary>
        /// <param name="bitmap">The bitmap.</param>
        /// <param name="name">The name.</param>
        /// <exception cref="ObjectDisposedException">The object has been disposed.</exception>
        /// <exception cref="OutOfMemoryException">Insufficient memory to add the image.</exception>
        public void Add(GmicBitmap bitmap, string name)
        {
            if (bitmap is null)
            {
                ExceptionUtil.ThrowArgumentNullException(nameof(bitmap));
            }

            VerifyNotDisposed();

            uint            width  = (uint)bitmap.Width;
            uint            height = (uint)bitmap.Height;
            GmicPixelFormat format = bitmap.GetGmicPixelFormat();

            NativeImageFormat      nativeImageFormat;
            GmicImageListPixelData pixelData;
            // G'MIC uses a planar format, so the stride between rows is the image width.
            int planeStride = (int)width;

            // Add a new image to the native G'MIC image list.
            GmicNative.GmicImageListAdd(nativeImageList, width, height, format, name, out pixelData, out nativeImageFormat);

            // Copy the pixel data to the native image.
            bitmap.CopyToGmicImage(nativeImageFormat, pixelData, planeStride);
        }