Вырезка фрагментов изображение на новое изображение через FreeImage

В общем, с помощью FreeImage.NET хочу нарезать куски изображения на новое изображение.

Делаю вот так:

  var src = FreeImage.Load(FREE_IMAGE_FORMAT.FIF_JPEG, imagePath, FREE_IMAGE_LOAD_FLAGS.JPEG_ACCURATE);

        var mapresult = _drawRectsCalculatorService.GetDrawRects(rectangles);
        var targetWidth = mapresult.RectMaps.Max(r => r.TargetImageRectangle.Right) + _drawRectsCalculatorService.Margin;
        var targetHeight = mapresult.RectMaps.Max(r => r.TargetImageRectangle.Bottom) + _drawRectsCalculatorService.Margin;
        var bmp = new System.Drawing.Bitmap(targetWidth + 100, targetHeight + 100);
        
        bmp.SetResolution(FreeImage.GetResolutionX(src), FreeImage.GetResolutionY(src));
        var dst = FreeImage.CreateFromBitmap(bmp);
        foreach (var rm in mapresult.RectMaps)
        {
            var part = FreeImage.Copy(src, rm.SourceImageRectangle.Left, rm.SourceImageRectangle.Top, rm.SourceImageRectangle.Right, rm.SourceImageRectangle.Bottom);
            FreeImage.Paste(dst, part, rm.TargetImageRectangle.Left, rm.TargetImageRectangle.Top, 255) ;
        }
        using (var memoryStream = new MemoryStream())
        {
            FreeImage.SaveToStream(dst, memoryStream, FREE_IMAGE_FORMAT.FIF_JPEG);
            return memoryStream.ToArray();
        }

При этом на выходе получаю пустой массив... Хотя везде возвращается true, где осуществляется Paste. Понять не могу в чем дело и как править...

+- точно такая же реализация, через GDI+ работает нормально:

            using (var image= Image.FromFile(imagePath))
            {
                ImageCodecInfo codeInfo = GetEncoder(image.RawFormat);
                var mapresult = _drawRectsCalculatorService.GetDrawRects(rectangles);
                var targetWidth = mapresult.RectMaps.Max(r => r.TargetImageRectangle.Right) + _drawRectsCalculatorService.Margin;
                var targetHeight = mapresult.RectMaps.Max(r => r.TargetImageRectangle.Bottom) + _drawRectsCalculatorService.Margin;
                using (var bmp = new Bitmap(targetWidth, targetHeight))
                {
                    bmp.SetResolution(image.HorizontalResolution, image.VerticalResolution);
                    using (var graphics = Graphics.FromImage(bmp))
                    {
                        var whiteBrush = Brushes.White;
#pragma warning disable CS0728 // Possibly incorrect assignment to local which is the argument to a using or lock statement
                        lock (whiteBrush)
                            whiteBrush = (Brush)whiteBrush.Clone();
#pragma warning restore CS0728 // Possibly incorrect assignment to local which is the argument to a using or lock statement
                        using (whiteBrush)
                            graphics.FillRectangle(whiteBrush, 0, 0, targetWidth, targetHeight);
                        foreach (var rm in mapresult.RectMaps)
                            graphics.DrawImage(image, rm.TargetImageRectangle, rm.SourceImageRectangle, GraphicsUnit.Pixel);
                    }
                    using (var memoryStream = new MemoryStream())
                    {
                        var myEncoderParameters = new EncoderParameters(1);
                        myEncoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, compression);
                        bmp.Save(memoryStream, GetEncoder(ImageFormat.Jpeg), myEncoderParameters);
                        return memoryStream.ToArray();
                    }
                        
                }
            }

Ответы (1 шт):

Автор решения: iluxa1810

Точно не понял почему не работал подход, который был описан выше, но оказалось, что во FreeImageNet есть так же не только функциональный подход, но и объектный и вот в таком виде все заработало:

   public byte[] Cut(string imagePath, Models.Rectangle[] rectangles, int compression)
    {
        using (var srcBitmap = FreeImageBitmap.FromFile(imagePath))
        {
            var mapresult = _drawRectsCalculatorService.GetDrawRects(rectangles);
            var targetWidth = mapresult.RectMaps.Max(r => r.TargetImageRectangle.Right) + _drawRectsCalculatorService.Margin;
            var targetHeight = mapresult.RectMaps.Max(r => r.TargetImageRectangle.Bottom) + _drawRectsCalculatorService.Margin;
            using (var dstBitmap = new FreeImageBitmap(targetWidth, targetHeight))
            {
                dstBitmap.FillBackground(new RGBQUAD(Color.White));
                dstBitmap.SetResolution(srcBitmap.HorizontalResolution, srcBitmap.VerticalResolution);
                foreach (var rm in mapresult.RectMaps)
                {
                    var part = srcBitmap.Copy(rm.SourceImageRectangle);
                    dstBitmap.Paste(part, rm.TargetImageRectangle.Left, rm.TargetImageRectangle.Top, 255);

                }
                using (var memoryStream = new MemoryStream())
                {
                    dstBitmap.Save(memoryStream, FREE_IMAGE_FORMAT.FIF_JPEG,(FREE_IMAGE_SAVE_FLAGS)compression);
                    return memoryStream.ToArray();
                }
            }
        }
    }
→ Ссылка