gpt4 book ai didi

c# - 使用 C# 不显示实际图像时裁剪图像问题

转载 作者:太空狗 更新时间:2023-10-29 21:33:25 25 4
gpt4 key购买 nike

我正在使用 JCrop 裁剪 Image。如果我向用户显示实际图像,它工作正常。但是,如果我显示 Resize Image 而不是实际 Image,那么我将获得 Resize ImageCoordinates

那么,如何根据它裁剪 Image 呢?在这里,我传递了已保存 ImageImage 路径。

简而言之,如果保存的 Image 大小为 715 * 350,那么我将在基于 CSS 的小尺寸弹出窗口中显示它。因此,我将获得那个小尺寸 图像坐标。我在主 Image 上应用那些 Coordinates

我的代码:

using (System.Drawing.Image OriginalImage = System.Drawing.Image.FromFile(Img))
{
using (System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(Width, Height))
{
bmp.SetResolution(OriginalImage.HorizontalResolution, OriginalImage.VerticalResolution);

using (System.Drawing.Graphics Graphic = System.Drawing.Graphics.FromImage(bmp))
{
Graphic.SmoothingMode = SmoothingMode.AntiAlias;
Graphic.InterpolationMode = InterpolationMode.HighQualityBicubic;
Graphic.PixelOffsetMode = PixelOffsetMode.HighQuality;
Graphic.DrawImage(OriginalImage, new System.Drawing.Rectangle(0, 0, Width, Height), X, Y, Width, Height, System.Drawing.GraphicsUnit.Pixel);

MemoryStream ms = new MemoryStream();
bmp.Save(ms, OriginalImage.RawFormat);

ms.Close();
ms.Flush();
ms.Dispose();

return ms.GetBuffer();
}
}
}

最佳答案

您显示的代码用于调整大小,而不是裁剪(在 Graphic.DrawImage() 调用中,您不关心裁剪坐标,只需应用目标宽度/高度)

要裁剪图像,您可以只使用 Bitmap.Clone()方法。只需将您从 JCrop 中提取的裁剪坐标传递给它即可。 (以下示例中的 cropzone)

public static async Task CropImage()
{
var client = new WebClient();
var sourceimg = new Uri(@"http://logonoid.com/images/stack-overflow-logo.png");
var destination = new FileInfo(Path.Combine(Directory.GetCurrentDirectory(), "logoCropped.png"));
if (destination.Exists)
destination.Delete();
using (Stream sourceStream = await client.OpenReadTaskAsync(sourceimg))
{
using (Bitmap source = new Bitmap(sourceStream))
{
Rectangle cropzone = new Rectangle(0, 0, 256, 256);
using (Bitmap croppedBitmap = source.Clone(cropzone, source.PixelFormat))
{
croppedBitmap.Save(destination.FullName, ImageFormat.Png);
}
}
}
}

关于您的代码的一些建议:

  • 当只是裁剪时,不涉及调整大小的操作。所以SmoothingMode, InterpolationMode, PixelOffsetMode参数在这里没有用。
  • 关于MemoryStream,您最好在using 语句中使用它。它避免了手动调用 Close()Dispose(),并保证无论发生什么都调用它们。关于 Flush() 方法,它 just does nothingMemoryStream 类上。

关于c# - 使用 C# 不显示实际图像时裁剪图像问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28513574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com