使用C#未显示实际图像时裁剪图像问题

时间:2015-02-14 07:41:04

标签: c# image jcrop

我正在使用JCrop裁剪Image。如果我向用户显示实际图像,它工作正常。但是,如果我显示调整大小Image而不是实际Image,那么我将调整大小Co-ordinates Image

然后,如何基于它裁剪Image?在这里,我正在通过保存Image的{​​{1}}路径。

简而言之,如果对于Image,如果保存Image大小,那么我将在基于CSS的小尺寸弹出窗口中显示它。所以,我会得到715 * 350的小尺寸Co-ordinates。我在主Image上应用了这些Co-ordinates

我的代码:

Image

2 个答案:

答案 0 :(得分:5)

您显示的代码用于调整大小,而不是用于裁剪(在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);
            }
        }
    }
}

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

  • 刚刚裁剪时,没有涉及调整大小的操作。因此,此处SmoothingModeInterpolationModePixelOffsetMode参数无用。
  • 关于MemoryStream,您最好在using声明中使用它。它避免了对Close()Dispose()的手动调用,并保证无论发生什么事情都会调用它们。关于Flush()方法,MemoryStream类上的just does nothing

答案 1 :(得分:1)

Jcrop拥有tureSize属性。

$.Jcrop('#image',{ trueSize: [715, 350] });

你应该得到大图像的正确坐标。

http://deepliquid.com/content/Jcrop_Sizing_Issues.html