Вырезка фрагментов изображение на новое изображение через 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();
}
}
}
}