余白削除


多少バカっぽいコードだがピクセル数が推測でしか求められない場合は調べるしかない。
ポイントのシンボルを描画してアルファの部分のみの余白を除いた画像を保存するコード。

symbolGraphics

ISimpleMarkerSymbol marker = new SimpleMarkerSymbolClass();
marker.Style = esriSimpleMarkerStyle.esriSMSDiamond;

IPoint pt = new PointClass();
pt.PutCoords(50, 50);
ISymbol symbol = (ISymbol)marker;

using (Bitmap img = new Bitmap(100, 100, System.Drawing.Imaging.PixelFormat.Format32bppArgb))
using (Graphics g = Graphics.FromImage(img))
{
  var hdc = g.GetHdc();
  symbol.SetupDC(hdc.ToInt32(), null);
  symbol.Draw(pt);
  symbol.ResetDC();

  g.ReleaseHdc(hdc);
  g.Dispose();

  var rect = ImageTest.GetARect(img);
  using (Bitmap newImg = new Bitmap(rect.Width, rect.Height))
  using (Graphics newG = Graphics.FromImage(newImg))
  {
    newG.DrawImage(img, new Rectangle(0, 0, rect.Width, rect.Height), rect, GraphicsUnit.Pixel);
    newG.Dispose();
    newImg.Save("c:\\test2.png", System.Drawing.Imaging.ImageFormat.Png);

  }
  img.Save("c:\\test1.png", System.Drawing.Imaging.ImageFormat.Png);

}//end img

Marshal.FinalReleaseComObject(marker);
Marshal.FinalReleaseComObject(pt);

どうせ下準備データの場合だろうし、全スキャン。
実行時で使うならGetPixcelよかましだろうがスキップした方が良いかも。

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;

namespace MxdImageMarker
{
  class ImageTest
  {

    public static Rectangle GetARect(Bitmap img)
    {

      Rectangle rect = new System.Drawing.Rectangle(0, 0, img.Width, img.Height);

      BitmapData imgData = img.LockBits(
                     rect,
                     ImageLockMode.ReadOnly,
                     img.PixelFormat
                 );

      IntPtr ptr = imgData.Scan0;
      // * ARGB = *4
      int cnt = img.Width * img.Height * 4;
      byte[] argbValues = new byte[cnt];

      Marshal.Copy(ptr, argbValues, 0, cnt);
      int minX, maxX, minY, maxY;
      minX = maxX = minY = maxY = int.MinValue;

      //全スキャン
      for (int alIndex = 3; alIndex < argbValues.Length; alIndex += 4)
      {
        var alpha = argbValues[alIndex];
        //透過なら戻す
        if (alpha == 0)
          continue;

        var h = (alIndex / 4) / img.Width;
        var w = (alIndex / 4) - (h * img.Width);
        if (minX == int.MinValue)
        {
          minY = maxY = h;
          minX = maxX = w;
        }
        else
        {
          minX = Math.Min(w, minX);
          maxX = Math.Max(w, maxX);
          minY = Math.Min(h, minY);
          maxY = Math.Max(h, maxY);
        }
      }//end loop

      if (maxX < img.Width - 1)
        maxX += 1;
      if (maxY < img.Height - 1)
        maxY += 1;

      img.UnlockBits(imgData);

      return new Rectangle(minX, minY, (maxX - minX), (maxY - minY));
    }//end method

  }
}
カテゴリー: 開発 タグ: パーマリンク