C#下载又报错没报错图片报错

本文略微有些长,花了好几晚时间编辑修改,若在措辞排版上有问题,请谅解。本文共分为四篇,下面是主要内容,也是软件开发基本流程。
主要描述实现本程序的目的及对需求进行分析,即为什么要花时间来编写,需要哪些功能等;
根据现有的需求,设计出一个可行的方案(即使可能还存在某些问题),用户需要输入什么,程序需要处理什么,数据库、功能、界面的设计等;
通过编程实现图标批量下载的功能,重点分析其中遇到的问题及解决的方法。
展示分享实现的工具及成果,小结经验。
一、需求分析
在平时的程序开发中,为了快速搭建较为美观的用户界面,经常要下载一些图标作为按钮、控件等的外观,甚至需要自己动手制作一些特定的图标或图片。自己动力,不得不说需要一定的技术和审美功底;下载,又得到网上到处找,找到一套适合主题、色彩、尺寸、美观大方的图标还真是一件不容易的事。
幸好,网上有很多专门下载图标的网站,常用的有:
这些网站各有各的优点,共同点是都包含大量图标,我个人比较喜欢在EasyIcon上去搜索,下载,也很喜欢它的网址。它有优点有:
(1)支持中英文搜索。EasyIcon支持中文和英文的搜索,当然,它的原始图标名称还是英文,只不过在搜索前,利用百度翻译API将中文翻译成英文,再进行搜索。
(2)用户体验好。很多网址在进行浏览时,都是需要点击"下一页"之类的按钮,而它支持键盘快捷键,而且体验效果还不错;它的界面、文字啊也比较活泼,比如按热度排序,它优雅的称其为"抛头露面的优先"。
(3)保持更新。作为写代码的,我们最害怕开源的东西不再更新了,EasyIcon图标更新频率还算将就。
(4)打包下载,有时,我们下载的图标不只一个,可以使用它的打包下载功能。(但此功能有一定的限制,如每一次打包下载有数量限制,且下载尺寸、格式等不便设置,这也是为什么要重新写一个批量下载工具的原因。)
所以,总结下来,我们需要一个程序,实现批量下载不同格式、尺寸的图标到本地,以便于搜索和利用。
二、方案设计
1.浏览器下载图标
设计方案并不是直接就想出来,还是要根据实际来一点一点地分析、确定。我们用浏览器来下载一个图标试一试。
在这个网址里,包含2000个(40页)不同尺寸和格式和图标。fatcowhosting-icons就是这些图标集合的分类名称。
单击第一个图标,进入其他详细页面:,这里我们可以看到很多参数信息。
点击PNG图标下载,我们下载这个图标。(这一次的下载,就是以后代码中最内层循环的一段代码。)我们看到了真实的下载地址:
只要我们有这个下载网址,无论在哪个浏览器或自定义程序,都可以进行下载。
2.分析下载地址
来看每一页的地址:
fatcowhosting-icons表示图标集合名称,1表示页数
那我们来分析一下这个地址:
这个下载地址可分解为:固定部分+格式+图标编号+尺寸
再来看一下,下载需要的参数:下载地址+文件保存路径+文件名称
综合分析可以看出,图标的格式、尺寸、文件保存路径可以由用户指定,现在关键是缺少图标编号和文件名称。
假如我们已经知道了图标编号,并将下载网址输入到浏览器的地址栏中提交,浏览器可自动识别出下载的文件名称,这是为何?说明用户向服务器提交这个地址后,服务器返回了一些消息,其中就包括文件名称,所以,通过某种编程方式(后面会提到,暂不用着急去查询),可以获取到文件名称。
好了,现在唯一缺少的主是图标编号了。通过观察网站的其他图标,可以发现这些编号都是连接的,比如530832是Zoom_Selection_icon的编号,而530831是Zoom_Refresh的编号;再看图标fatcowhosting-icons集合的每一页都是50个(最后一页除外),我们是不可以根据每一个图标和最后一个图标的编号来获取这个图标集合的所有编号?答案是肯定的。
那我们怎么来获取第一个和最后一个的编号?如果我们又通过某种技术手段获取到这两上编号了&&等等,如果能获取这两个编号了,为什么不获取直接获取所有编号呢?是的,通过网页抓取的某种方法应该可以获取所有编号。
3.画一个简单的流程图
下面是使用亿图图示专家V7.9绘制流程图:
4.写一个简单的接口
分析了这么久,写一个简单的接口来理一下我们的思路。(C#)
private string[] FileT
//文件格式
private int[] FileS
//文件大小
private string FileP
//文件保存路径
private int TotalP
//图标总页数
//获取图标总页数
private int GetTotalPages(string iconsURL) { }
//获取当前页的编号
private string[] GetIDs(string pageURL){}
private bool DownICO(string[] fileType, int[] fileSize, int totalPages)
//一层:遍历每一页
for (int i = 0; i & totalP i++)
//获取当前页所有编号
string[] strIDs = GetIDs("PagesURL");
//两层:遍历每一个编号
for (int j = 0; j & strIDs.L j++)
//三层:遍历每一种尺寸
for (int k = 0; k & fileSize.L k++)
//四层:遍历每一种格式
for (int m = 0; m & filePath.L m++)
//生成下载链接
string downURL = "http://download.easyicon.net/格式/编号/尺寸/";
Down(this.FilePath, downURL);
//其他操作&&
//下载每一个图标
private bool Down(string filePath,string downURL){}
5.关键问题
下面是代码中使用的关键问题的解决方案:
(1)如果一切参数都能找到,用哪个类或方法来下载?System.Net.WebClient的DownloadFile方法。
(2)怎样获取图标总页数?根据观察网页,每一页都有"个图标,翻X页可看完",X即为总页数,通过抓取网页字符串即可;
(3)怎样获取每一页所有图标的编号?当然还是通过网页抓取。如下图,通过审查元素,可以看到每一个图标的编号和名称。
(4)怎样获取下载图标的名称?有两种方式,一是网页内容抓取;二是通过根据服务返回的信息来提取。
三、编程实现
编程比较简单,下面是网页操作的两个比较核心的函数(第一次抓取网页,不知道这样好不好)
第一个函数,是通过网页地址来获取网页代码的。
/// &summary&
/// 根据URL获取网页代码
/// &/summary&
/// &param name="strURL"&URL地址&/param&
/// &returns&网页代码字符串&/returns&
public static string GetHtmlString(string strURL)
Uri uri = new Uri(strURL);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream stream = response.GetResponseStream();
string strHtml = "";
if (stream != null)
StreamReader sr = new StreamReader(stream);
strHtml = sr.ReadToEnd();
sr.Close();
stream.Close();
response.Close();
return strH
第二个函数主要是根据向服务器提交图标的下载链接,获取返回的headers信息,这些信息里就包含了图标的名称。
/// &summary&
/// 根据URL获取headers信息
/// &/summary&
/// &param name="URL"&URL地址&/param&
/// &returns&headers信息列表&/returns&
public static Dictionary&string, string& GetHeaders(string URL)
Dictionary&string, string& headerList = new Dictionary&string, string&();
WebRequest webRequestObject =HttpWebRequest.Create(URL);
WebResponse responseObject =webRequestObject.GetResponse();
foreach (string headerKey in responseObject.Headers)
headerList.Add(headerKey, responseObject.Headers[headerKey]);
responseObject.Close();
return headerL
问题一:验证码问题
编程其实并不是那么一蹴而就,或多或少会遇到一些之前没有想到的问题
其中遇到最大的问题是验证问题。如果大量下载图标(第一次达166个图标)时,向服务器提交下载地址时,它会弹出验证窗口,下面是用webBrowser控件得到的结果。
这是另外一个网页返回的结果
解决:一开始的解决思路是去抓包,获取提交链接和内容,就像其他程序让用户打码一样;后来我就得反正是要打码,还不如让用户直接看到这个页面(当然,这样的界面显示很粗糙,实际上应该去获取这个图标,并将这个图标显示在用户面前),于是用了webBrowser控件;接下来,需要一个输入,然后提交:输入采用了VB中的InputBox,这样更方便,不需要去暂停线程,提交就是用HtmlElement的GetAttribute来获取提交按钮,用InvokeMember方法来执行。
问题二:程序假死问题
下载量过多,程序界面肯定会假死,用户体验十分不好。需要新建线程,但要注意新线程与主线程之间的控件信息交互问题。
解决:下面是用委托来实现向ListBoxAdv添加下载返回的消息的函数。
delegate void SetValueCallback(ListBoxAdv lstA,string log);
private void SetPropertyValue(ListBoxAdv lstA,string log)
if (lstA.InvokeRequired)
SetValueCallback d = new SetValueCallback(SetPropertyValue);
lstA.Invoke(d, new object[] { lstA,log });
lstA.Items.Add(log);
lstA.SetSelected(lstA.Items.Count-1,true);
lstA.SelectedIndex=lstA.Items.Count - 1;
SetPropertyValue(lstAdv, "消息&&&);
问题三:下载失败问题
并不是所有图标都能正常下载,即使多次反复下载,它容易出现,下载结果只有25字节大小的图标(重复下载也无效),可能是因为网速的原因。
解决:遍历所有25字节的图标,删除后重新下载(当然也需要耗时)。
四、成果展示
下载的图标
我测试下载了png 32的图标,约8000多个,本地和云盘都有,文件以编号+名称命名,通过编号,我可以再从官网下载到其他需要的图标,通过名称可以搜索到需要的图标。
源码下载:
1.服务器是怎样检测本机连续下载图标的数量的?是根据IP还是其他,如果搞清它的机制,是否可以通过某种代码操作跳过它的检测,而不再使用验证码呢?
2.怎样查询到图标集合的名称,可以通过某种SQL代码查询到吗?如果可以,整个easyicons就不是问题了!
阅读(...) 评论()C#抓取网络图片保存到本地
0人收藏此代码,
这段代码可以抓取指定的url的网络图片,并保存到本地
public Bitmap Get_img()
Bitmap img =
HttpWebResponse res =
System.Uri httpUrl = new System.Uri(&/xxx.png &);
req = (HttpWebRequest)(WebRequest.Create(httpUrl));
req.Timeout = 180000; //设置超时值10秒
req.UserAgent = &XXXXX&;
req.Accept = &XXXXXX&;
req.Method = &GET&;
res = (HttpWebResponse)(req.GetResponse());
img = new Bitmap(res.GetResponseStream());//获取图片流
img.Save(@&E:/& + DateTime.Now.ToFileTime().ToString() + &.png&);//随机名
catch (Exception ex)
string aa= ex.M
res.Close();
//该代码片段来自于: /codes/csharp/2122
相关代码片段:
最新C#代码片段
合作网站:&>&C#处理png图片位深度和交错属性
C#处理png图片位深度和交错属性
上传大小:161KB
自己做的一款PNG图片处理程序。把位深度转换成8位,交错属性!
经过10W+张图片以上测试过。很好用。
综合评分:3.7(14位用户评分)
下载个数:
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var parentWrap = $(this).parents(".respond_box"),
q = parentWrap.find(".form1").serializeArray(),
resStr = $.trim(parentWrap.find(".res_area_r").val());
console.log(q);
//var res_area_r = $.trim($(".res_area_r").val());
if (resStr == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
//var mess = $(".res_area_r").val();
var mess = resS
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, _username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click",'.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
var parentWrap = $(v).parents(".respond_box");
parentWrap.find(".res_area_r").val($.trim(parentWrap.find(".res_area").val()));
评论共有12条
值得借鉴,不过背景色给变了
不是真正的转换,实际的格式根本不是png的,无法用ps打开仅仅是8位深度的gif而已
做的还可以,但还得vs来编译,比较麻烦。
上传者:freebluer
上传时间:积分/C币:3
上传者:sinat_
上传时间:积分/C币:5
上传者:stongyann
上传时间:积分/C币:3
上传者:qiao6174
上传时间:积分/C币:3
上传者:evenkidd1
上传时间:积分/C币:3
上传者:youjiahua1
上传时间:积分/C币:0
上传者:qq_
上传时间:积分/C币:0
上传者:qq_
上传时间:积分/C币:2
上传者:zhanghaizhe
上传时间:积分/C币:3
上传者:weiaipan1314
上传时间:积分/C币:3
上传者:chuhanjunhun
上传时间:积分/C币:5
上传时间:积分/C币:0
上传者:qq_
上传时间:积分/C币:0
上传者:aem666
上传时间:积分/C币:3
上传者:mnbhjkoiu
上传时间:积分/C币:0
上传者:qq_
上传时间:积分/C币:0
上传者:wuyoutiyu
上传时间:积分/C币:2
上传者:sz
上传时间:积分/C币:3
上传者:salanghyou
上传时间:积分/C币:0
上传者:crimeace
上传时间:积分/C币:0
审核通过送C币
创建者:jiaguoxinzhi
创建者:zang
创建者:zang
上传者其他资源上传者专辑
C#网络游戏编程完整教程
Winista.HtmlParser.dll
c# 验证码识别 OCR图片识别 准确率非常高
验证码识别 ocr tesseract的使用,含有例子和源码
名片识别源码
VIP会员动态
CSDN下载频道资源及相关规则调整公告V11.10
下载频道用户反馈专区
下载频道积分规则调整V1710.18
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
C#处理png图片位深度和交错属性
会员到期时间:
剩余下载个数:
剩余C币:593
剩余积分:0
为了良好体验,不建议使用迅雷下载
积分不足!
资源所需积分/C币
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分/C币
当前拥有积分
当前拥有C币
(仅够下载10个资源)
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
为了良好体验,不建议使用迅雷下载
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可奖励5下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
C#处理png图片位深度和交错属性相关文章推荐
string FileUlr = Server.MapPath("~/images/test/");//获取文件所在目录
FileUlr += "5.jpg";//获取现有文件所在位...
前段时间整理电脑发现好多下载的图片、剧集什么的名字很乱,想把它们都重命名一遍。网上找了一圈都是win系小程序,没有OS X适用的版本,于是只能自己写。发上来留个记录,写得不咋地但还算好用。
需求逻辑很...
最近下了一些电影,名字都太长了,想要批量重命名,强迫症写了一个脚本,如下:#!/usr/bin/python
def rename():
path="F:\\迅雷下载"
问题现有如下文件需要重命名(没错,奶爸推荐的英语学习教程,哈哈!):
目的是命名成这样(这不是简单的排序,是从文件名里面截取的,因为按照原始文件名是不能按照里面的数字来排序的):
解决用bat...
using System.D
using System.G
using System.IO;
using System.Li...
他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)}

我要回帖

更多关于 又报错没报错图片 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信