var src = new Bitmap("Lena.bmp");
var gray = ImagingDotNet.CvtColor(src, ImagingDotNet.COLOR_BGR2GRAY);
var dst = (Bitmap)src.Clone();
ImagingDotNet.Threshold(gray, dst, 128, 255, ImagingDotNet.THRESH_OTSU);
// これは設定できない
var bmp = new Bitmap(256, 64, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
for (int i = 0; i < 256; i++)
{
bmp.Palette.Entries[i] = Color.FromArgb(i, i, i);
}
// これなら設定できる
var bmp = new Bitmap(256, 64, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
var pal = bmp.Palette;
for (int i = 0; i < 256; i++)
{
pal.Entries[i] = Color.FromArgb(i, i, i);
}
bmp.Palette = pal;
// Bitmapオブジェクトの作成
var bmp = new Bitmap(@"C:\Temp\Lenna.bmp");
// 画像の1画素あたりのビット数の取得(8,24,32など)
var bitCount = Bitmap.GetPixelFormatSize(bmp.PixelFormat);
DrawImageAbortに関しては、使った事がないので、いまいち理解できていないのですが、描画先の左上の座標のみを指定する場合は、画像ファイルのDPI情報(dot per inch, 画像の解像度)に合わせて表示されるので、注意が必要です。(というより使わない方が良いです)
例えば、下記のようなコードで72dpiと96dpiのファイルをそれぞれ開くと、
pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
using (var bmp = new Bitmap(@"C:\Temp\Lenna.jpg"))
using (var g = Graphics.FromImage(pictureBox1.Image))
{
g.DrawImage(bmp, 0, 0);
}
pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
using (var bmp = new Bitmap(@"C:\Temp\Lenna.jpg"))
using (var g = Graphics.FromImage(pictureBox1.Image))
{
g.DrawImage(bmp, 0, 0, bmp.Width, bmp.Height);
}
/// <summary>
/// 画像を縦に結合する
/// </summary>
/// <param name="src">結合するBitmapの配列</param>
/// <returns>結合されたBitmapオブジェクト</returns>
public Bitmap ImageCombineV(Bitmap[] src)
{
// 結合後のサイズを計算
int dstWidth = 0, dstHeight = 0;
System.Drawing.Imaging.PixelFormat dstPixelFormat = System.Drawing.Imaging.PixelFormat.Format8bppIndexed;
for (int i = 0; i < src.Length; i++)
{
if (dstWidth < src[i].Width) dstWidth = src[i].Width;
dstHeight += src[i].Height;
// 最大のビット数を検索
if (Bitmap.GetPixelFormatSize(dstPixelFormat)
< Bitmap.GetPixelFormatSize(src[i].PixelFormat))
{
dstPixelFormat = src[i].PixelFormat;
}
}
var dst = new Bitmap(dstWidth, dstHeight, dstPixelFormat);
var dstRect = new Rectangle();
using (var g = Graphics.FromImage(dst)) {
for (int i = 0; i < src.Length; i++)
{
dstRect.Width = src[i].Width;
dstRect.Height = src[i].Height;
// 描画
g.DrawImage(src[i], dstRect, 0, 0, src[i].Width, src[i].Height, GraphicsUnit.Pixel);
// 次の描画先
dstRect.Y = dstRect.Bottom;
}
}
return dst;
}
使用方法は
var images = new Bitmap[] {
new Bitmap("Lenna.bmp"),
new Bitmap("Mandrill.bmp"),
new Bitmap("Parrots.bmp")
};
// 画像の結合
var combinedImage = ImageCombineV(images);
// 結合画像の保存
combinedImage.Save("combinedImage.bmp", System.Drawing.Imaging.ImageFormat.Bmp);
// 解放
foreach (var bmp in images)
{
bmp.Dispose();
}