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); } }
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)); }
/// <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); }