This one with scaling seems to work fine.
[CommandMethod("doit")]
static public void doit()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
using (Transaction tr = db.TransactionManager.StartTransaction())
{
ObjectId dictId = RasterImageDef.GetImageDictionary(db);
if (dictId.IsNull)
dictId = RasterImageDef.CreateImageDictionary(db);
DBDictionary dict = tr.GetObject(dictId, OpenMode.ForWrite) as DBDictionary;
RasterImageDef rid = new RasterImageDef();
rid.SourceFileName = "c:\\Capture.tif";
ObjectId defId = dict.SetAt("Capture", rid);
rid.Load();
tr.AddNewlyCreatedDBObject(rid, true);
RasterImage ri = new RasterImage();
ri.ImageDefId = defId;
ri.ShowImage = true;
ri.Orientation = new CoordinateSystem3d(Point3d.Origin, Vector3d.XAxis, Vector3d.YAxis);
ri.TransformBy(Matrix3d.Scaling(3 / rid.Size.X, new Point3d(0, 0, 0)));
BlockTableRecord btr = tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
btr.AppendEntity(ri);
tr.AddNewlyCreatedDBObject(ri, true);
ri.AssociateRasterDef(rid);
tr.Commit();
}
}