首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > VB Dotnet >

请问关于图片裁剪时,怎么实现自定义裁剪方向的有关问题

2012-02-06 
请教关于图片裁剪时,如何实现自定义裁剪方向的问题现在需要实现一个手机图片下载的功能,大概需求是后台不

请教关于图片裁剪时,如何实现自定义裁剪方向的问题
现在需要实现一个手机图片下载的功能,大概需求是后台不分尺寸上传原图(原图尺寸一般情况下均大于手机屏幕大小),前台页面用户输入自己手机屏幕尺寸下载,下载前程序自动等比率缩小并裁剪成用户所需尺寸保存在服务器供用户下载!
目前基本功能已实现,目前的设计是如果等比率缩小后需要裁掉一部分来适合手机屏幕则默认保留左上方部分,裁掉右下部分。但又发现这样裁剪的精度不够,经常出现人物被裁掉一半的情况,急需改进。
现在打算改进如下:后台上传原图时,根据原图画面布局情况,选择裁剪方向(如:裁掉左上,左下,右上,右下),并记录在数据库相应字段中,前台用户输入尺寸下载前,以输入尺寸的宽或高为基准(以较长的为基准)自动等比例缩小,若缩小后不满足手机尺寸,则按数据库中记录的裁剪方向裁剪,以达到人工控制裁剪精度的目的。

问题:如何利用DrawImage()方法来实现自定义方向裁剪?
希望各位高手指教,或提供更为简便可行的方案来提高裁剪的精度,第一次发帖暂无分可给,以后努力打工赚分偿还,小弟先行作揖了! ^_^

下面提供小弟目前默认裁剪右下部分的方法源码,请各位看官多多改进,指教,小弟感激不尽……

C# code
 Public Sub Dram(ByVal p_img_Original As Image, ByVal p_int_Width As Integer, ByVal p_int_Height As Integer)            Dim l_int_OriWidth As Integer = p_img_Original.Width            Dim l_int_OriHeight As Integer = p_img_Original.Height            Dim l_int_IntWidth As Integer = 0            Dim l_int_IntHeight As Integer = 0            Dim l_int_OffsetX As Integer = 0            Dim l_int_OffsetY As Integer = 0            ' 以寬度為基準,保持寬高比計算縮放之後的高度            l_int_IntWidth = p_int_Width            l_int_IntHeight = l_int_OriHeight * l_int_IntWidth / l_int_OriWidth            ' 如果縮放之後的高度不夠新高度,則改用以高度為基準,保持寬高比計算縮放之後的寬度            If l_int_IntHeight < p_int_Height Then                l_int_IntHeight = p_int_Height                l_int_IntWidth = l_int_OriWidth * l_int_IntHeight / l_int_OriHeight                ' 計算圖片偏移位置            Else                ' 計算圖片偏移位置                l_int_OffsetY = (p_int_Height - l_int_IntHeight) / 4    ' 垂直居中偏上            End If            ' 準備畫布            Dim l_bmp_New As Bitmap = New Bitmap(p_int_Width, p_int_Height)            Dim l_gph_New As Graphics = Graphics.FromImage(l_bmp_New)            l_gph_New.InterpolationMode = InterpolationMode.High            l_gph_New.SmoothingMode = SmoothingMode.HighQuality            l_gph_New.Clear(Color.Transparent)            ' 生成圖片            l_gph_New.DrawImage(p_img_Original, New Rectangle(l_int_OffsetX, l_int_OffsetY, l_int_IntWidth, l_int_IntHeight))            '输出图片            'prepare output stream buffer            Dim l_ms_Buffer As MemoryStream = New MemoryStream()            l_bmp_New.Save(l_ms_Buffer, ImageFormat.Jpeg)            ' output to browser            HttpContext.Current.Response.Clear()            HttpContext.Current.Response.ContentType = "image/jpeg"            HttpContext.Current.Response.BinaryWrite(l_ms_Buffer.ToArray())        End Sub


[解决办法]
提供参考,你自己修改下: 
Dim iNewWidth As Integer
Dim iNewHeight As Integer
Dim units As GraphicsUnit = GraphicsUnit.Pixel
Try
Dim sourceImg As Image = Image.FromFile("图片路径")
Dim b As New Bitmap(iNewWidth, iNewHeight, PixelFormat.Format32bppArgb)
Dim g As Graphics = Graphics.FromImage(b)
Dim p1(2) As Point
g.Clear(Color.Transparent)
p1(0) = New Point(0, 0)
p1(1) = New Point(iNewWidth, 0)
p1(2) = New Point(0, iNewHeight)
g.DrawImage(sourceImg, p1, New Rectangle(0, 0, sourceImg.Width, sourceImg.Height), units)
Dim fi As System.IO.FileInfo = New System.IO.FileInfo("保存的路径")
If fi.Directory.Exists = False Then
fi.Directory.Create()
End If
b.Save("保存的路径")
sourceImg.Dispose()
Catch ex As Exception
End Try

热点排行