📄 freeimagebitmap.cs
字号:
: this(filename, FREE_IMAGE_LOAD_FLAGS.DEFAULT)
{
}
/// <summary>
/// Initializes a new instance of the <see cref="FreeImageBitmap"/> class bases on the specified file.
/// </summary>
/// <param name="filename">The complete name of the file to load.</param>
/// <param name="useIcm">Ignored.</param>
/// <exception cref="Exception">The operation failed.</exception>
/// <exception cref="ArgumentNullException"><paramref name="filename"/> is null.</exception>
/// <exception cref="FileNotFoundException"><paramref name="filename"/> does not exist.</exception>
public FreeImageBitmap(string filename, bool useIcm)
: this(filename)
{
}
/// <summary>
/// Initializes a new instance of the <see cref="FreeImageBitmap"/> class bases on the specified file
/// with the specified loading flags.
/// </summary>
/// <param name="filename">The complete name of the file to load.</param>
/// <param name="flags">Flags to enable or disable plugin-features.</param>
/// <exception cref="Exception">The operation failed.</exception>
/// <exception cref="ArgumentNullException"><paramref name="filename"/> is null.</exception>
/// <exception cref="FileNotFoundException"><paramref name="filename"/> does not exist.</exception>
public FreeImageBitmap(string filename, FREE_IMAGE_LOAD_FLAGS flags)
: this(filename, FREE_IMAGE_FORMAT.FIF_UNKNOWN, flags)
{
}
/// <summary>
/// Initializes a new instance of the <see cref="FreeImageBitmap"/> class bases on the specified file
/// in the specified format.
/// </summary>
/// <param name="filename">The complete name of the file to load.</param>
/// <param name="format">Format of the image.</param>
/// <exception cref="Exception">The operation failed.</exception>
/// <exception cref="ArgumentNullException"><paramref name="filename"/> is null.</exception>
/// <exception cref="FileNotFoundException"><paramref name="filename"/> does not exist.</exception>
public FreeImageBitmap(string filename, FREE_IMAGE_FORMAT format)
: this(filename, format, FREE_IMAGE_LOAD_FLAGS.DEFAULT)
{
}
/// <summary>
/// Initializes a new instance of the <see cref="FreeImageBitmap"/> class bases on the specified file
/// in the specified format with the specified loading flags.
/// </summary>
/// <param name="filename">The complete name of the file to load.</param>
/// <param name="format">Format of the image.</param>
/// <param name="flags">Flags to enable or disable plugin-features.</param>
/// <exception cref="Exception">The operation failed.</exception>
/// <exception cref="ArgumentNullException"><paramref name="filename"/> is null.</exception>
/// <exception cref="FileNotFoundException"><paramref name="filename"/> does not exist.</exception>
public FreeImageBitmap(string filename, FREE_IMAGE_FORMAT format, FREE_IMAGE_LOAD_FLAGS flags)
{
if (filename == null)
{
throw new ArgumentNullException("filename");
}
if (!File.Exists(filename))
{
throw new FileNotFoundException("filename");
}
saveInformation.loadFlags = flags;
mdib = FreeImage.OpenMultiBitmapEx(filename, ref format, flags, false, true, false);
if (mdib.IsNull)
{
throw new Exception();
}
originalFormat = format;
if (FreeImage.GetPageCount(mdib) != 0)
{
if (FreeImage.GetPageCount(mdib) == 1)
{
if (!FreeImage.CloseMultiBitmapEx(ref mdib, FREE_IMAGE_SAVE_FLAGS.DEFAULT))
{
throw new Exception();
}
dib = FreeImage.LoadEx(filename, flags, ref format);
if (dib.IsNull)
{
throw new Exception();
}
return;
}
else
{
dib = FreeImage.LockPage(mdib, 0);
if (!dib.IsNull)
{
return;
}
}
}
FreeImage.CloseMultiBitmap(mdib, FREE_IMAGE_SAVE_FLAGS.DEFAULT);
throw new Exception();
}
/// <summary>
/// Initializes a new instance of the <see cref="FreeImageBitmap"/> class
/// bases on the specified size.
/// </summary>
/// <param name="width">The width, in pixels, of the new <see cref="FreeImageBitmap"/>.</param>
/// <param name="height">The height, in pixels, of the new <see cref="FreeImageBitmap"/>.</param>
/// <exception cref="Exception">The operation failed.</exception>
public FreeImageBitmap(int width, int height)
{
dib = FreeImage.Allocate(
width,
height,
24,
FreeImage.FI_RGBA_RED_MASK,
FreeImage.FI_RGBA_GREEN_MASK,
FreeImage.FI_RGBA_BLUE_MASK);
if (dib.IsNull)
{
throw new Exception();
}
}
/// <summary>
/// Initializes a new instance of the <see cref="FreeImageBitmap"/> class bases on the specified resource.
/// </summary>
/// <param name="type">The class used to extract the resource.</param>
/// <param name="resource">The name of the resource.</param>
/// <exception cref="Exception">The operation failed.</exception>
public FreeImageBitmap(Type type, string resource)
: this(type.Module.Assembly.GetManifestResourceStream(type, resource))
{
}
/// <summary>
/// Initializes a new instance of the <see cref="FreeImageBitmap"/> class bases on the specified size
/// and with the resolution of the specified <see cref="System.Drawing.Graphics"/> object.
/// </summary>
/// <param name="width">The width, in pixels, of the new <see cref="FreeImageBitmap"/>.</param>
/// <param name="height">The height, in pixels, of the new <see cref="FreeImageBitmap"/>.</param>
/// <param name="g">The Graphics object that specifies the resolution for the new <see cref="FreeImageBitmap"/>.</param>
/// <exception cref="Exception">The operation failed.</exception>
/// <exception cref="ArgumentNullException"><paramref name="g"/> is null.</exception>
public FreeImageBitmap(int width, int height, Graphics g)
: this(width, height)
{
FreeImage.SetResolutionX(dib, (uint)g.DpiX);
FreeImage.SetResolutionX(dib, (uint)g.DpiY);
}
/// <summary>
/// Initializes a new instance of the <see cref="FreeImageBitmap"/> class bases on the specified size and format.
/// </summary>
/// <param name="width">The width, in pixels, of the new <see cref="FreeImageBitmap"/>.</param>
/// <param name="height">The height, in pixels, of the new <see cref="FreeImageBitmap"/>.</param>
/// <param name="format">The PixelFormat enumeration for the new <see cref="FreeImageBitmap"/>.</param>
/// <exception cref="Exception">The operation failed.</exception>
/// <exception cref="ArgumentException"><paramref name="format"/> is invalid.</exception>
/// <exception cref="ArgumentOutOfRangeException">
/// <paramref name="width"/> or <paramref name="height"/> are less or equal zero.</exception>
public FreeImageBitmap(int width, int height, PixelFormat format)
{
if (width <= 0)
{
throw new ArgumentOutOfRangeException("width");
}
if (height <= 0)
{
throw new ArgumentOutOfRangeException("height");
}
uint bpp, redMask, greenMask, blueMask;
if (!FreeImage.GetFormatParameters(format, out bpp, out redMask, out greenMask, out blueMask))
{
throw new ArgumentException("format is invalid.");
}
dib = FreeImage.Allocate(width, height, (int)bpp, redMask, greenMask, blueMask);
if (dib.IsNull)
{
throw new Exception();
}
}
/// <summary>
/// Initializes a new instance of the <see cref="FreeImageBitmap"/> class bases on the specified size and type.
/// Only non standard bitmaps are supported.
/// </summary>
/// <param name="width">The width, in pixels, of the new <see cref="FreeImageBitmap"/>.</param>
/// <param name="height">The height, in pixels, of the new <see cref="FreeImageBitmap"/>.</param>
/// <param name="type">The type of the bitmap.</param>
/// <exception cref="Exception">The operation failed.</exception>
/// <exception cref="ArgumentOutOfRangeException">
/// <paramref name="type"/> is FIT_BITMAP or FIT_UNKNOWN.</exception>
/// <exception cref="ArgumentException"><paramref name="type"/> is invalid.</exception>
/// <exception cref="ArgumentOutOfRangeException">
/// <paramref name="width"/> or <paramref name="height"/> are less or equal zero.</exception>
public FreeImageBitmap(int width, int height, FREE_IMAGE_TYPE type)
{
if (width <= 0)
{
throw new ArgumentOutOfRangeException("width");
}
if (height <= 0)
{
throw new ArgumentOutOfRangeException("height");
}
if ((type == FREE_IMAGE_TYPE.FIT_BITMAP) || (type == FREE_IMAGE_TYPE.FIT_UNKNOWN))
{
throw new ArgumentException("type is invalid.");
}
dib = FreeImage.AllocateT(type, width, height, 0, 0u, 0u, 0u);
if (dib.IsNull)
{
throw new Exception();
}
}
/// <summary>
/// Initializes a new instance of the <see cref="FreeImageBitmap"/> class bases on the specified size,
/// pixel format and pixel data.
/// </summary>
/// <param name="width">The width, in pixels, of the new <see cref="FreeImageBitmap"/>.</param>
/// <param name="height">The height, in pixels, of the new <see cref="FreeImageBitmap"/>.</param>
/// <param name="stride">nteger that specifies the byte offset between the beginning
/// of one scan line and the next. This is usually (but not necessarily)
/// the number of bytes in the pixel format (for example, 2 for 16 bits per pixel)
/// multiplied by the width of the bitmap. The value passed to this parameter must
/// be a multiple of four..</param>
/// <param name="format">The PixelFormat enumeration for the new <see cref="FreeImageBitmap"/>.</param>
/// <param name="scan0">Pointer to an array of bytes that contains the pixel data.</param>
/// <exception cref="Exception">The operation failed.</exception>
/// <exception cref="ArgumentException"><paramref name="format"/> is invalid.</exception>
/// <exception cref="ArgumentOutOfRangeException">
/// <paramref name="width"/> or <paramref name="height"/> are less or equal zero.</exception>
public FreeImageBitmap(int width, int height, int stride, PixelFormat format, IntPtr scan0)
{
if (width <= 0)
{
throw new ArgumentOutOfRangeException("width");
}
if (height <= 0)
{
throw new ArgumentOutOfRangeException("height");
}
uint bpp, redMask, greenMask, blueMask;
bool topDown = (stride > 0);
stride = (stride > 0) ? stride : (stride * -1);
if (!FreeImage.GetFormatParameters(format, out bpp, out redMask, out greenMask, out blueMask))
{
throw new ArgumentException("format is invalid.");
}
dib = FreeImage.ConvertFromRawBits(
scan0, width, height, stride, bpp, redMask, greenMask, blueMask, topDown);
if (dib.IsNull)
{
throw new Exception();
}
}
/// <summary>
/// Initializes a new instance of the <see cref="FreeImageBitmap"/> class.
/// </summary>
/// <exception cref="Exception">The operation failed.</exception>
/// <exception cref="SerializationException">The operation failed.</exception>
public FreeImageBitmap(SerializationInfo info, StreamingContext context)
{
try
{
byte[] data = (byte[])info.GetValue("Bitmap Data", typeof(byte[]));
if (data != null && data.Length > 0)
{
MemoryStream memory = new MemoryStream(data);
FREE_IMAGE_FORMAT format = FREE_IMAGE_FORMAT.FIF_TIFF;
dib = FreeImage.LoadFromStream(memory, ref format);
}
if (dib.IsNull)
{
throw new Exception();
}
}
catch
{
throw new SerializationException();
}
}
/// <summary>
/// Frees all managed and unmanaged ressources.
/// </summary>
~FreeImageBitmap()
{
Dispose(false);
}
#endregion
#region Operators
/// <summary>
/// Converts a <see cref="FreeImageBitmap"/> instance to a <see cref="Bitmap"/> instance.
/// </summary>
/// <param name="value">A <see cref="FreeImageBitmap"/> instance.</param>
/// <returns>A new instance of <see cref="Bitmap"/> initialized to <paramref name="value"/>.</returns>
/// <remarks>
/// The implicit conversion from <see cref="FreeImageBitmap"/> into Bitmap
/// allows to create an instance on the fly and use it as if
/// was a Bitmap. This way it can be directly used with a
/// PixtureBox for example without having to call any
/// conversion operations.
/// </remarks>
public static implicit operator Bitmap(FreeImageBitmap value)
{
value.EnsureNotDisposed();
return FreeImage.GetBitmap(value.dib, true);
}
/// <summary>
/// Converts a <see cref="Bitmap"/> instance to a <see cref="FreeImageBitmap"/> instance.
/// </summary>
/// <param name="value">A <see cref="Bitmap"/> instance.</param>
/// <returns>A new instance of <see cref="FreeImageBitmap"/> initialized to <paramref name="value"/>.</returns>
/// <remarks>
/// The implicit conversion from <see cref="Bitmap"/> into <see cref="FreeImageBitmap"/>
/// allows to create an instance on the fly to perform
/// image processing operations and converting it back.
/// </remarks>
public static implicit operator FreeImageBitmap(Bitmap value)
{
FreeImageBitmap result = null;
FIBITMAP newDib = FreeImage.CreateFromBitmap(value, true);
if (!newDib.IsNull)
{
result = new FreeImageBitmap();
result.dib = newDib;
}
return result;
}
/// <summary>
/// Determines whether two specified <see cref="FreeImageBitmap"/> objects have the same value.
/// </summary>
/// <param name="left">A <see cref="FreeImageBitmap"/> or a null reference (<b>Nothing</b> in Visual Basic).</param>
/// <param name="right">A <see cref="FreeImageBitmap"/> or a null reference (<b>Nothing</b> in Visual Basic).</param>
/// <returns>
/// <b>true</b> if the value of left is the same as the value of right; otherwise, <b>false</b>.
/// </returns>
public static bool operator ==(FreeImageBitmap left, FreeImageBitmap right)
{
if (object.ReferenceEquals(left, right))
{
return true;
}
else if (object.ReferenceEquals(left, null) || object.ReferenceEquals(right, null))
{
return false;
}
else
{
left.EnsureNotDisposed();
right.EnsureNotDisposed();
return FreeImage.Compare(left.dib, right.dib, FREE_IMAGE_COMPARE_FLAGS.COMPLETE);
}
}
/// <summary>
/// Determines whether two specified <see cref="FreeImageBitmap"/> objects have different values.
/// </summary>
/// <param name="left">A <see cref="FreeImageBitmap"/> or a null reference (<b>Nothing</b> in Visual Basic).</param>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -