private void PaintDetailAreas(Graphics g) { if (Photo != null) { foreach (var detail in Photo.Project.DetailAreas) { var pen = new Pen(Color.Orange, 3); g.DrawRectangle(pen, ImageConverter.ScaleRectangle(detail.Crop, _scaleFactor)); } } }
private void saveToolStripMenuItem_Click(object sender, System.EventArgs e) { var fd = new SaveFileDialog() { DefaultExt = ".jpg", Filter = "JPEG images|*.jpg" }; if (fd.ShowDialog(this) == DialogResult.OK) { ImageConverter.SaveJpeg(fd.FileName, image, 85); } }
private void StoreRect(Point p1, Point p2) { if (Image == null) { return; } var p0 = new Point(Math.Min(p1.X, p2.X), Math.Min(p1.Y, p2.Y)); var sz = new Size(Math.Abs(p2.X - p1.X), Math.Abs(p2.Y - p1.Y)); Crop = new Rectangle(p0, sz); Crop = Rectangle.Intersect(Crop, new Rectangle(new Point(0, 0), Image.Size)); // transform to image coordinates Crop = ImageConverter.ScaleRectangle(Crop, 1.0 / _scaleFactor); if (OnDetailSelected != null) { OnDetailSelected(this, new EventArgs()); } // delete the reversible rectangle MyDrawReversibleRectangle(p1, p2); }
/// <summary> /// Renders last group level in horizontal direction, as a strip of detail tiles /// </summary> /// <param name="f">The f.</param> /// <param name="input">The input.</param> /// <returns></returns> private Image RenderRow(GroupFilter f, PhotoDetailCollection input) { var boxes = f.ParameterValues.SelectedValues.Count; // calc size of individual images, fit into configured bounding box var boxSize = ScaleToBoundingBox ? ImageConverter.FitInto(TileSize, BoundingBox, true) : TileSize; var stripSize = new Size(boxes * (boxSize.Width + Padding), boxSize.Height); Bitmap b = new Bitmap(stripSize.Width, stripSize.Height); using (Graphics g = Graphics.FromImage(b)) { g.FillRectangle(new SolidBrush(Color.White), new Rectangle(new Point(0, 0), stripSize)); var destRect = new Rectangle(new Point(0, 0), boxSize); // fill the image tiles in X-direction foreach (var pv in f.ParameterValues.SelectedValues) { // g.FillRectangle(new SolidBrush(Color.GreenYellow), destRect); var tileLabel = string.Empty; var tiles = f.Filter(pv, input); if (tiles.Count == 0) { // no matching tile image, leave empty } else if (tiles.Count > 1) { // more than one matching image, write warning tileLabel = pv + ": " + tiles.Count + " matches"; } else { // exactly one matching image var photoDetail = tiles[0]; using (var tileImg = photoDetail.Image) { using (var scaledTileImg = ImageConverter.ResizeImage(tileImg, boxSize)) { g.DrawImage(scaledTileImg, destRect.Location); } } tileLabel = pv; } if (!string.IsNullOrEmpty(tileLabel)) { RenderLabel(g, tileLabel, destRect, false); } // move target rect to the left destRect.Offset(boxSize.Width + Padding, 0); MainWindow.Instance.Progress++; } var strip = (Image)b; return(strip); } }