lipsync/trunk/Boare.Lib.AppUtil/BitmapEx.cs

159 lines
4.8 KiB
C#
Raw Normal View History

/*
* BitmapEx.cs
* Copyright (c) 2008-2009 kbinani
*
* This file is part of Boare.Lib.AppUtil.
*
* Boare.Lib.AppUtil is free software; you can redistribute it and/or
* modify it under the terms of the BSD License.
*
* Boare.Lib.AppUtil is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
namespace Boare.Lib.AppUtil {
public unsafe class BitmapEx : IDisposable {
private Bitmap m_base;
private bool m_locked = false;
private BitmapData m_bd;
private int m_stride;
private int m_byte_per_pixel;
public int Width {
get {
return m_base.Width;
}
}
public int Height {
get {
return m_base.Height;
}
}
public void Dispose() {
EndLock();
m_base.Dispose();
}
public void EndLock() {
if ( m_locked ) {
m_base.UnlockBits( m_bd );
m_locked = false;
}
}
public Bitmap GetBitmap() {
return (Bitmap)m_base.Clone();
}
public Color GetPixel( int x, int y ) {
if ( !m_locked ) {
BeginLock();
}
int location = y * m_stride + m_byte_per_pixel * x;
byte* dat = (byte*)m_bd.Scan0;
byte b = dat[location];
byte g = dat[location + 1];
byte r = dat[location + 2];
byte a = 255;
if ( m_base.PixelFormat == PixelFormat.Format32bppArgb ) {
a = dat[location + 3];
}
return Color.FromArgb( a, r, g, b );
}
public void SetPixel( int x, int y, Color color ) {
if ( !m_locked ) {
BeginLock();
}
int location = y * m_stride + m_byte_per_pixel * x;
byte* dat = (byte*)m_bd.Scan0;
dat[location] = (byte)color.B;
dat[location + 1] = (byte)color.G;
dat[location + 2] = (byte)color.R;
if ( m_base.PixelFormat == PixelFormat.Format32bppArgb ) {
dat[location + 3] = (byte)color.A;
}
}
public void BeginLock(){
if ( !m_locked ) {
m_bd = m_base.LockBits( new Rectangle( 0, 0, m_base.Width, m_base.Height ),
ImageLockMode.ReadWrite,
m_base.PixelFormat );
m_stride = m_bd.Stride;
switch ( m_base.PixelFormat ) {
case PixelFormat.Format24bppRgb:
m_byte_per_pixel = 3;
break;
case PixelFormat.Format32bppArgb:
m_byte_per_pixel = 4;
break;
default:
throw new Exception( "unsuported pixel format" );
}
m_locked = true;
}
}
~BitmapEx() {
m_base.Dispose();
}
public BitmapEx( Image original ) {
m_base = new Bitmap( original );
}
public BitmapEx( string filename ) {
m_base = new Bitmap( filename );
}
public BitmapEx( Stream stream ) {
m_base = new Bitmap( stream );
}
public BitmapEx( Image original, Size newSize ) {
m_base = new Bitmap( original, newSize );
}
public BitmapEx( int width, int height ) {
m_base = new Bitmap( width, height );
}
public BitmapEx( Stream stream, bool useIcm ) {
m_base = new Bitmap( stream, useIcm );
}
public BitmapEx( string filename, bool useIcm ) {
m_base = new Bitmap( filename, useIcm );
}
public BitmapEx( Type type, string resource ) {
m_base = new Bitmap( type, resource );
}
public BitmapEx( Image original, int width, int height ) {
m_base = new Bitmap( original, width, height );
}
public BitmapEx( int width, int height, Graphics g ) {
m_base = new Bitmap( width, height, g );
}
public BitmapEx( int width, int height, PixelFormat format ) {
m_base = new Bitmap( width, height, format );
}
public BitmapEx( int width, int height, int stride, PixelFormat format, IntPtr scan0 ) {
m_base = new Bitmap( width, height, stride, format, scan0 );
}
}
}