【求助】图片上传处理的问题

liubin911 2009-01-05 09:52:17
我的现状:
我们主要是给小公司做小网站,客户都人便宜,买的都是一般的空间(不带sql数据库),都是用access数据库一起放在空间里。所以没有Image类型字段,图片都是在数据库中保存文件名,之后图片上传到空间的一个文件夹里的。但是有些客户那里没有图片处理人员,他们用数码相机拍完的产品图直接就上传到空间,而且我们的有些商务都不告诉客户导致很多用户穿了几张图就把空间弄满了。经理指出了,些客户那里没有图片处理人员,所以不能限制图片大小,不管多大的图都要可以直接上传。


我的问题:
怎么才能通过程序吧客户选的图片处理后在上传,就像阿里巴巴诚信通图片助手那样,不用又什么别的功能,只要吧客户的图片像素和物理大小处理后,然后再上传到空间 我用的是.net2003 , 望指教




...全文
160 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
tommy9802 2009-01-05
  • 打赏
  • 举报
回复
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
using System.Net;
using System.Text.RegularExpressions;

public partial class uploadpicture : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{

}
protected void Button1_Click(object sender, EventArgs e)
{
if (FileUpload1.HasFile)
{
string fileContentType = FileUpload1.PostedFile.ContentType;
if (fileContentType == "image/bmp" || fileContentType == "image/gif" || fileContentType == "image/pjpeg")
{
string name = FileUpload1.PostedFile.FileName; // 客户端文件路径

FileInfo file = new FileInfo(name);
string fileName = file.Name; // 文件名称
string fileName_s = "x_" + file.Name; // 缩略图文件名称
string fileName_sy = "text_" + file.Name; // 水印图文件名称(文字)
string fileName_syp = "water_" + file.Name; // 水印图文件名称(图片)
string webFilePath = Server.MapPath("ImgUpload/" + fileName); // 服务器端文件路径
string webFilePath_s = Server.MapPath("ImgUpload/" + fileName_s);  // 服务器端缩略图路径
string webFilePath_sy = Server.MapPath("ImgUpload/" + fileName_sy); // 服务器端带水印图路径(文字)
string webFilePath_syp = Server.MapPath("ImgUpload/" + fileName_syp); // 服务器端带水印图路径(图片)
string webFilePath_sypf = Server.MapPath("51aspx.png"); // 服务器端水印图路径(图片)

if (!File.Exists(webFilePath))
{
try
{
FileUpload1.SaveAs(webFilePath); // 使用 SaveAs 方法保存文件
AddWater(webFilePath, webFilePath_sy);
AddWaterPic(webFilePath, webFilePath_syp, webFilePath_sypf);
MakeThumbnail(webFilePath, webFilePath_s, 130, 130, "Cut"); // 生成缩略图方法
Label1.Text = "提示:文件“" + fileName + "”成功上传,并生成“" + fileName_s + "”缩略图,文件类型为:" + FileUpload1.PostedFile.ContentType + ",文件大小为:" + FileUpload1.PostedFile.ContentLength + "B";
}
catch (Exception ex)
{
Label1.Text = "提示:文件上传失败,失败原因:" + ex.Message;
}
}
else
{
Label1.Text = "提示:文件已经存在,请重命名后上传";
}
}
else
{
Label1.Text = "提示:文件类型不符";
}
}
}
/**/
/// <summary>
/// 生成缩略图
/// </summary>
/// <param name="originalImagePath">源图路径(物理路径)</param>
/// <param name="thumbnailPath">缩略图路径(物理路径)</param>
/// <param name="width">缩略图宽度</param>
/// <param name="height">缩略图高度</param>
/// <param name="mode">生成缩略图的方式</param>
public static void MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, string mode)
{
System.Drawing.Image originalImage = System.Drawing.Image.FromFile(originalImagePath);

int towidth = width;
int toheight = height;

int x = 0;
int y = 0;
int ow = originalImage.Width;
int oh = originalImage.Height;

switch (mode)
{
case "HW"://指定高宽缩放(可能变形)
break;
case "W"://指定宽,高按比例
toheight = originalImage.Height * width / originalImage.Width;
break;
case "H"://指定高,宽按比例
towidth = originalImage.Width * height / originalImage.Height;
break;
case "Cut"://指定高宽裁减(不变形)
if ((double)originalImage.Width / (double)originalImage.Height > (double)towidth / (double)toheight)
{
oh = originalImage.Height;
ow = originalImage.Height * towidth / toheight;
y = 0;
x = (originalImage.Width - ow) / 2;
}
else
{
ow = originalImage.Width;
oh = originalImage.Width * height / towidth;
x = 0;
y = (originalImage.Height - oh) / 2;
}
break;
default:
break;
}

//新建一个bmp图片
System.Drawing.Image bitmap = new System.Drawing.Bitmap(towidth, toheight);

//新建一个画板
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap);

//设置高质量插值法
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;

//设置高质量,低速度呈现平滑程度
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

//清空画布并以透明背景色填充
g.Clear(System.Drawing.Color.Transparent);

//在指定位置并且按指定大小绘制原图片的指定部分
g.DrawImage(originalImage, new System.Drawing.Rectangle(0, 0, towidth, toheight),
new System.Drawing.Rectangle(x, y, ow, oh),
System.Drawing.GraphicsUnit.Pixel);

try
{
//以jpg格式保存缩略图
bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg);
}
catch (System.Exception e)
{
throw e;
}
finally
{
originalImage.Dispose();
bitmap.Dispose();
g.Dispose();
}
}

/**/
/// <summary>
/// 在图片上增加文字水印
/// </summary>
/// <param name="Path">原服务器图片路径</param>
/// <param name="Path_sy">生成的带文字水印的图片路径</param>
protected void AddWater(string Path, string Path_sy)
{
string addText = "51aspx.com";
System.Drawing.Image image = System.Drawing.Image.FromFile(Path);
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(image);
g.DrawImage(image, 0, 0, image.Width, image.Height);
System.Drawing.Font f = new System.Drawing.Font("Verdana", 60);
System.Drawing.Brush b = new System.Drawing.SolidBrush(System.Drawing.Color.Green);

g.DrawString(addText, f, b, 35, 35);
g.Dispose();

image.Save(Path_sy);
image.Dispose();
}

/**/
/// <summary>
/// 在图片上生成图片水印
/// </summary>
/// <param name="Path">原服务器图片路径</param>
/// <param name="Path_syp">生成的带图片水印的图片路径</param>
/// <param name="Path_sypf">水印图片路径</param>
protected void AddWaterPic(string Path, string Path_syp, string Path_sypf)
{
System.Drawing.Image image = System.Drawing.Image.FromFile(Path);
System.Drawing.Image copyImage = System.Drawing.Image.FromFile(Path_sypf);
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(image);
g.DrawImage(copyImage, new System.Drawing.Rectangle(image.Width - copyImage.Width, image.Height - copyImage.Height, copyImage.Width, copyImage.Height), 0, 0, copyImage.Width, copyImage.Height, System.Drawing.GraphicsUnit.Pixel);
g.Dispose();

image.Save(Path_syp);
image.Dispose();
}
}
liubin911 2009-01-05
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 HDNGO 的回复:]
C# code
/**//// <summary>
/// 把位图保存为jpeg格式,并可以这是保存质量
/// </summary>
/// <param name="b">位图</param>
/// <param name="name">文件名</param>

/// <param name="quality">保存质量</param>
/// <remarks>质量范围0-100,类型为long</remarks>
private void JpegSave( Bitmap b, string name, long quality )
{
ImageCodecInfo myImageCodecInfo;
Encoder myEncoder;
Enc…
[/Quote]


是2003的代码吗,需要引用什么 有很多参数有问题
jadedm 2009-01-05
  • 打赏
  • 举报
回复
LZ你个做程序的做完后还要帮客户处理图片啊教客户处理下图片比你写程序快好吧少的就用光影魔术手快,
或者你写个压缩算法
fxcjy 2009-01-05
  • 打赏
  • 举报
回复
请参考这里:http://blog.csdn.net/fxcjy/archive/2008/12/12/3502912.aspx

//下面是根据上传的文件,产生缩略图,然后保存到数据库image表中(为将问题简单化,这里把表的字段做了减少).

string fstr = FileUpload1.PostedFile.FileName; ;//上传的文件名
string fmime = FileUpload1.PostedFile.ContentType;//文件的MIME类型
string sql;
int fsize = FileUpload1.PostedFile.ContentLength; //文件大小

//利用Bitmap类获得图像的尺寸
Bitmap bmp = new Bitmap(fstr);
int imgH = bmp.Height;
int imgW = bmp.Width;
//缩略图保持原图片比例,计算出大小
float simg1,simg2;
if (imgW > imgH)
{
//横向图片
simg1 = 100;
simg2 = simg1/imgW * imgH;
}
else
{
//纵向图片
simg2 = 100;
simg1 = simg2/imgH * imgW;
}


//生成缩略图
System.Drawing.Image smallimg = bmp.GetThumbnailImage((int)simg1, (int)simg2, null, IntPtr.Zero);
MemoryStream ms = new MemoryStream();
smallimg.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);//将图像保存到内存流中
byte[] data ={ }; //建立一个字节数组,用于保存图像数据
data=ms.ToArray();//把流的数据保存到数组
fsize = (int)ms.Length;//流数据大小

//生成SQL语句,因为使用了字节数组,必须使用带参数的SQL,否则无法执行,@1就是参数
SqlConnection conn = new SqlConnection();
conn.ConnectionString = ConfigurationManager.ConnectionStrings["testConnectionString"].ConnectionString;
conn.Open();
sql = "insert into [image] (itype,imagedata,isize) values('" + fmime + "',@1," + fsize + ")";
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.Add(new SqlParameter("@1", SqlDbType.Image));
cmd.Parameters["@1"].Value = data;
int count = cmd.ExecuteNonQuery();
liubin911 2009-01-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jiang_jiajia10 的回复:]
http://zzk.cnblogs.com/s?w=.net+%e5%9b%be%e7%89%87%e5%a4%84%e7%90%86
帮你搜索一下。不知道有没有 你想要的。下次问问题前先在我发给你的地址里搜索一下。
[/Quote]

各大引擎都搜索了

我要的效果是客户上传选择一个超大图,之后点上传(这个过程中吧大图处理成符合我们标准的图,之后吧这个图上传)
liangjing851212 2009-01-05
  • 打赏
  • 举报
回复
d
pp_shy 2009-01-05
  • 打赏
  • 举报
回复
首先access数据库也是可以存储图片的
Access OLE字段 存图片的例子
http://topic.csdn.net/u/20080709/17/9622d3d1-74a6-43b0-93d1-3bd2032dc954.html

然后如果楼主觉得用户上传的图片过大,可以通过生成缩略图方式,把缩略图存储进数据库
HDNGO 2009-01-05
  • 打赏
  • 举报
回复
简单的把质量降低,JPG可以控制压缩率的。。。。

可以先bmp掉~~

Bitmap bmp = new Bitmap("文件名");


然后。。压缩~~


/**//// <summary>
/// 把位图保存为jpeg格式,并可以这是保存质量
/// </summary>
/// <param name="b">位图</param>
/// <param name="name">文件名</param>

/// <param name="quality">保存质量</param>
/// <remarks>质量范围0-100,类型为long</remarks>
private void JpegSave( Bitmap b, string name, long quality )
{
ImageCodecInfo myImageCodecInfo;
Encoder myEncoder;
EncoderParameter myEncoderParameter;
EncoderParameters myEncoderParameters;
myImageCodecInfo = FrmMain.GetEncoderInfo( "image/jpeg" );
myEncoder = Encoder.Quality;
myEncoderParameters = new EncoderParameters( 1 );


myEncoderParameter = new EncoderParameter( myEncoder, quality );
myEncoderParameters.Param[0] = myEncoderParameter;
b.Save( name, myImageCodecInfo, myEncoderParameters );
}

/**//// <summary>
/// 获取位图保存文件格式信息
/// </summary>
private static ImageCodecInfo GetEncoderInfo( String mimeType )
{
int j;
ImageCodecInfo[] encoders;
encoders = ImageCodecInfo.GetImageEncoders();
for( j = 0; j < encoders.Length; ++j )
{
f( encoders[ j ].MimeType == mimeType )
return encoders[ j ];
}
return null;
}
anncesky 2009-01-05
  • 打赏
  • 举报
回复
其实这个有简单解决方案

不知道你玩过gdi+没有

Graphics 类型提供了强大的图像处理工能

能缩略,剪辑图片,还可以改变图片的编码形式

你可以在用户上传图片的时候,先保存原图,再跟据这个原图进行缩略或剪辑

再保存为占据物理空间小的编码形式的新图,再把原图删除,这样就OK了,

不过这个功能要求network service有删除权限
HDNGO 2009-01-05
  • 打赏
  • 举报
回复

/**//// <summary>
/// 把位图保存为jpeg格式,并可以这是保存质量
/// </summary>
/// <param name="b">位图</param>
/// <param name="name">文件名</param>

/// <param name="quality">保存质量</param>
/// <remarks>质量范围0-100,类型为long</remarks>
private void JpegSave( Bitmap b, string name, long quality )
{
ImageCodecInfo myImageCodecInfo;
Encoder myEncoder;
EncoderParameter myEncoderParameter;
EncoderParameters myEncoderParameters;
myImageCodecInfo = FrmMain.GetEncoderInfo( "image/jpeg" );
myEncoder = Encoder.Quality;
myEncoderParameters = new EncoderParameters( 1 );


myEncoderParameter = new EncoderParameter( myEncoder, quality );
myEncoderParameters.Param[0] = myEncoderParameter;
b.Save( name, myImageCodecInfo, myEncoderParameters );
}

/**//// <summary>
/// 获取位图保存文件格式信息
/// </summary>
private static ImageCodecInfo GetEncoderInfo( String mimeType )
{
int j;
ImageCodecInfo[] encoders;
encoders = ImageCodecInfo.GetImageEncoders();
for( j = 0; j < encoders.Length; ++j )
{
f( encoders[ j ].MimeType == mimeType )
return encoders[ j ];
}
return null;
}
vipboy 2009-01-05
  • 打赏
  • 举报
回复
楼上的方法不错..
xd43100678 2009-01-05
  • 打赏
  • 举报
回复
晕,楼主,你个做程序的做完后还要帮客户处理图片啊。。花个2分钟教客户处理下图片比你写程序快好吧

少的就用,光影魔术手快,
大量图片就用,photoshop的批处理,

要比你搞这个快哎。。。只是小小建议
djf_1985 2009-01-05
  • 打赏
  • 举报
回复
帮顶
没处理过
你要在线减小图片大小,要不栽剪图片大小,要不降低图片像素
应该通过程序让图片降低像素好些
walkghost 2009-01-05
  • 打赏
  • 举报
回复
对付这种客户,你只有限制上传大小,并且在超过文件大小时给出图片处理建议和简易的步骤。有些完全没道理的需求不需要去实现。因为以你的客户出的价格不应该得到你所描述的那种功能。别老宠着客户。
你要是做OA或者其他一些大系统的时候,可以考虑自己写压缩啊图片处理啊之类的一些东西,要是一个几千块钱的网站就没这个必要了。或者你写也可以,以后每个网站都用上的话,成本也会降低。看你自己考虑了。
rascalwm 2009-01-05
  • 打赏
  • 举报
回复
在上传之前 对用户上传的文件做一个判断就OK了啊
例如 你得到用户要上传的文件 然后判断它的类型 大小 都通过了 就让他上传 不行的话 返回么
shine_fly 2009-01-05
  • 打赏
  • 举报
回复
Public Function AutoCompactCurrentProject()
Dim fs, f, s, filespec
Dim strProjectPath As String
Dim strProjectName As String
strProjectPath = Application.CurrentProject.Path
strProjectName = Application.CurrentProject.Name
filespec = strProjectPath & "\" & strProjectName
Set fs = CreateObject("Scripting.FileSystemObject")
Set f = fs.GetFile(filespec)
s = CLng(f.Size / 1000000) '转换成MB
If s > 20 Then
Application.SetOption ("Auto Compact"), 1 '压缩
Else
Application.SetOption ("Auto Compact"), 0 '不压缩
End If
End Function

要不然你就把它压缩了。
walkghost 2009-01-05
  • 打赏
  • 举报
回复
自己写压缩算法?汗。。。
wsg13793257207 2009-01-05
  • 打赏
  • 举报
回复
顶··你想减低他的物理大小?
shine_fly 2009-01-05
  • 打赏
  • 举报
回复
Access上传图片的容量就是2G啊,如果想大的话建议升SQL Server了。。
jiang_jiajia10 2009-01-05
  • 打赏
  • 举报
回复
http://zzk.cnblogs.com/s?w=.net+%e5%9b%be%e7%89%87%e5%a4%84%e7%90%86
帮你搜索一下。不知道有没有 你想要的。下次问问题前先在我发给你的地址里搜索一下。
加载更多回复(3)

62,254

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧