【发布时间】:2019-11-07 07:20:56
【问题描述】:
我想用this code 裁剪上传的图片。
另外,我想限制图像的大小(以字节为单位)并将其保存为 png 格式。 当我不使用裁剪后的图像时,我可以使用以下代码获取图像长度:
var postedFile = Request.Files["FileUpload1"];
long length=postedFile.ContentLength;
我的问题是我无法正确获得裁剪后的图像长度。如果我在Upload 函数中使用bytes.Length,它会得到大于来自 FileUpload 控件的原始图像长度的长度。
如何获得 png 格式的裁剪图像长度?
我的代码如下:
<script type="text/javascript"
src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js">
</script>
<script type="text/javascript" src="http://jcrop-
cdn.tapmodo.com/v0.9.8/js/jquery.Jcrop.js"></script>
<script type="text/javascript">
$(function () {
$('#FileUpload1').change(function () {
$('#Image1').hide();
var reader = new FileReader();
reader.onload = function (e) {
$('#Image1').show();
$('#Image1').attr("src", e.target.result);
$('#Image1').Jcrop({
onChange: SetCoordinates,
onSelect: SetCoordinates
});
}
reader.readAsDataURL($(this)[0].files[0]);
});
$('#btnCrop').click(function () {
var x1 = $('#imgX1').val();
var y1 = $('#imgY1').val();
var width = $('#imgWidth').val();
var height = $('#imgHeight').val();
var canvas = $("#canvas")[0];
var context = canvas.getContext('2d');
var img = new Image();
img.onload = function () {
canvas.height = height;
canvas.width = width;
context.drawImage(img, x1, y1, width, height, 0, 0, width, height);
$('#imgCropped').val(canvas.toDataURL());
$('[id*=btnUpload]').show();
};
img.src = $('#Image1').attr("src");
});
});
function SetCoordinates(c) {
$('#imgX1').val(c.x);
$('#imgY1').val(c.y);
$('#imgWidth').val(c.w);
$('#imgHeight').val(c.h);
$('#btnCrop').show();
};
</script>
<input type="file" id="FileUpload1" name="FileUpload1" />
<br />
<br />
<table border="0" cellpadding="0" cellspacing="5" style="text-align:right">
<tr >
<td>
<img id="Image1" alt="" style="display: none" />
<br />
<canvas id="canvas" height="5" width="5"></canvas>
</td>
</tr>
</table>
<br />
<input type="button" class="button" id="btnCrop" value="crop" style="display: none" />
<asp:Button ID="btnUpload" CssClass="button" runat="server" Text="upload" OnClick="Upload" Style="display: none" />
<input type="hidden" name="imgX1" id="imgX1" />
<input type="hidden" name="imgY1" id="imgY1" />
<input type="hidden" name="imgWidth" id="imgWidth" />
<input type="hidden" name="imgHeight" id="imgHeight" />
<input type="hidden" name="imgCropped" id="imgCropped" />
在后面的代码中:
var postedFile = Request.Files["FileUpload1"];
if (postedFile != null && postedFile.ContentLength > 0)
{
string filename = postedFile.FileName;
FileInfo fi = new FileInfo(filename);
string ext = fi.Extension;
if (ext != ".png")
{
lblMessage.Text = "please upload .png file";
return;
}
long length=postedFile.ContentLength;//this line return original length correctly
string base64 = Request.Form["imgCropped"];
byte[] bytes = Convert.FromBase64String(base64.Split(',')[1]);
int length= bytes.Length //get copped image length, but it greater than orig size
using (System.IO.FileStream stream = new System.IO.FileStream(path + "\\" + filename, System.IO.FileMode.Create))
{
stream.Write(bytes, 0, bytes.Length);
stream.Flush();
}
更新: 我尝试不同质量(1,0.95,...)和 png 和 jpeg 格式的 canvas.toDataURL(),并在选择整个图像时检查裁剪的图像长度,但这个长度与原始图像不同。 (如果我在裁剪图像中选择原始图像的 75% 像素,我想获得原始长度的 75% 的长度。) 设置质量和格式以获得与原始图像相同的质量的原因和价值是什么?
【问题讨论】:
-
你能发布你用来裁剪图像的代码吗?
-
我完全使用上面链接中描述的代码。
-
直接在此处发布相关部分,而不是作为链接。人们通常不倾向于点击外部链接,因此代码真的“不算数”。
-
上传的原始图像的质量是否低于用于编码裁剪版本的质量?例如,我可以下载一个 25k 的 jpg,稍微裁剪一下,然后以 100% 的质量将其保存为 100k png。您的代码将默认质量设置传递给
toDataURL,您可以将格式和质量显式设置为与上传文件相同的格式和质量。另见stackoverflow.com/questions/14383557/… -
代码应该在问题中,而不是链接到场外,以保持问题的长期价值。