typedrawing怎么保存网页图片图片

C#中图片已经保存于Bitmap中,如何实现将该Bitmap图像保存在本地磁盘_百度知道
C#中图片已经保存于Bitmap中,如何实现将该Bitmap图像保存在本地磁盘
Bitmap.Save(文件路径和名称, System.Drawing.Imaging.ImageFormat.Jpeg);后面是文件格式,我写的是jped你也可以自己选其他的
其他类似问题
为您推荐:
C# Bitmap类API说明看 使用SaveSave示例
Bitmap.Save()
本地磁盘的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁图片加字 OUT 啦,快用文字做图片:Typedrawing - 推酷
图片加字 OUT 啦,快用文字做图片:Typedrawing
图片加字应用,相信各位与笔者一样,手机里面肯定不止安装了一款。作为修图部队中的一员大将,此类应用已然成为了小清新和文艺青年的必备良品。但再好吃的点心,吃多了也未免枯燥乏腻。于是,脑洞大开的「攻城狮」和「程序猿」们开发出了这样一款「玩」图应用: Typedrawing 。利用它,我们可以将一串文字变为笔刷在屏幕上作画。
Typedrawing 的操作形式类似笔记本或 Memo 应用,每一幅作品都以缩略图的形式排列。屏幕下方那一只 Material Design 风格的按钮即为新建按钮。新作品的背景图层默认为白色,当然我们可以通过进入右上角的菜单去更改背景色或插入现有图片。
需要注意的是, Typedrawing 并不支持独立打开图片进行修改,也就是说,它并不属于修图应用的范畴,笔者更愿意将其归类为画图类应用。
创作界面顶部的四个按钮都是用来自定义笔触(也就是文字样式)的。第一个按钮用来录入文本,支持包括中文在内的所有标准编码字符,但由于在第二个菜单中, Typedrawing 并没有内置除英文之外的花式字体,所以为了画出更有趣的作品,笔者还是建议大家使用英文进行创作; 录入时,应用会在「Archive」一栏记住你曾经编辑过的文字以方便使用。
第三个菜单是用来调整笔触粗细的,也就是设定字体大小,我们可以让字体尺寸随速度而变,或者固定大小以统一风格、方便排版;除此之外,字间距也是选项之一,较密的字间距比较容辨认图形,较疏的字间距容易看清文字,大家各取所需即可。
最后一个菜单是色彩设定,免费版只提供纯色和黑白渐变风格,付费高级版解锁了彩虹色、渐变、双色相、经典等色彩包,能够让每一个字符都呈现不同的样式,组合起来倒也是别有风味,画一个长颈鹿感觉很像彩虹糖的广告呢。
现在,你可以在
Typedrawing。
已发表评论数()
&&登&&&录&&
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见6139人阅读
转载请标明出处:http://blog.csdn.net/lmj/article/details/
今天给大家带来CSDN的完结篇,即加入文章的查看和文章中图片的保存~
今天的目标:
首先是对控件使用的考虑,既然是网络上的文章,可能首先想到的就是webview,这里直接把页面载入到webview中是肯定不行的,首先得把页面上的数据解析,然后可能需要一个html的模版,然后把数据填充到模版,再将模版用于webview的展示。想了想,还是不是很方面,因为不确定文章中的段落、图片的数量和位置。所以最终照着网络上流传的版本使用List实现。
思路:把页面上的数据解析成 标题、摘要、段落(*)、图片(*),自定以一个对象,解析完成后生成一个List,当然顺序一定要和原文的一直。然后针对标题、摘要、段落、图片各做一个List的item的布局,最终显示。
好了,先简单看下csdn文章页的html:
我们在原先的代表上,添加对这样html页面的解析:
首先是封装的对象:
package com.zhy.
import java.util.L
public class NewsDto
private List&News&
private String nextPageU
public List&News& getNewses()
public void setNewses(List&News& newses)
this.newses =
public String getNextPageUrl()
return nextPageU
public void setNextPageUrl(String nextPageUrl)
this.nextPageUrl = nextPageU
package com.zhy.
public class News
public static interface NewsType
public static final int TITLE = 1;
public static final int SUMMARY = 2;
public static final int CONTENT = 3;
public static final int IMG = 4;
public static final int BOLD_TITLE = 5;
* 图片链接
private String imageL
public String getTitle()
public void setTitle(String title)
this.title =
public String getSummary()
public void setSummary(String summary)
this.summary =
this.type = NewsType.SUMMARY;
public String getContent()
public void setContent(String content)
this.content =
public String getImageLink()
return imageL
public void setImageLink(String imageLink)
this.imageLink = imageL
this.type = NewsType.IMG;
public int getType()
public void setType(int type)
this.type =
public String toString()
return &News [title=& + title + &, summary=& + summary + &, content=& + content + &, imageLink=& + imageLink
+ &, type=& + type + &]&;
添加了一个新的业务方法,把html字符串转化为List对象:
* 根据文章的url返回一个NewsDto对象
* @throws CommonException
public NewsDto getNews(String urlStr) throws CommonException
NewsDto newsDto = new NewsDto();
List&News& newses = new ArrayList&News&();
String htmlStr = DataUtil.doGet(urlStr);
Document doc = Jsoup.parse(htmlStr);
// 获得文章中的第一个detail
Element detailEle = doc.select(&.left .detail&).get(0);
Element titleEle = detailEle.select(&h1.title&).get(0);
News news = new News();
news.setTitle(titleEle.text());
news.setType(NewsType.TITLE);
newses.add(news);
Element summaryEle = detailEle.select(&div.summary&).get(0);
news = new News();
news.setSummary(summaryEle.text());
newses.add(news);
Element contentEle = detailEle.select(&div.con.news_content&).get(0);
Elements childrenEle = contentEle.children();
for (Element child : childrenEle)
Elements imgEles = child.getElementsByTag(&img&);
if (imgEles.size() & 0)
for (Element imgEle : imgEles)
if (imgEle.attr(&src&).equals(&&))
news = new News();
news.setImageLink(imgEle.attr(&src&));
newses.add(news);
// 移除图片
imgEles.remove();
if (child.text().equals(&&))
news = new News();
news.setType(NewsType.CONTENT);
if(child.children().size()==1)
Element cc = child.child(0);
if(cc.tagName().equals(&b&))
news.setType(NewsType.BOLD_TITLE);
} catch (IndexOutOfBoundsException e)
e.printStackTrace();
news.setContent(child.outerHtml());
newses.add(news);
newsDto.setNewses(newses);
return newsD
}测试代码:
@org.junit.Test
public void test02()
NewsItemBiz biz = new NewsItemBiz();
NewsDto newsDto = biz.getNews(&http://www.csdn.net/article//2819363-all-about-ddos&);
List&News& newses = newsDto.getNewses();
for(News news : newses)
System.out.println(news);
System.out.println(&-----&);
System.out.println(newsDto.getNextPageUrl());;
} catch (CommonException e)
// TODO Auto-generated catch block
e.printStackTrace();
然后我们可以拿到这样的结果数据:
好了,现在准备把解析完成的数据用到我们的app上。
上一教程已经完成了Xlist的显示,上拉与下拉,现在给它添加OnItemClickListener:
mXListView.setOnItemClickListener(new OnItemClickListener()
public void onItemClick(AdapterView&?& parent, View view, int position, long id)
NewsItem newsItem = mDatas.get(position-1);
Intent intent = new Intent(getActivity(), NewsContentActivity.class);
intent.putExtra(&url&, newsItem.getLink());
startActivity(intent);
到达显示内容的Activity页面:
package com.zhy.
import java.util.L
import me.maxwin.view.IXListViewLoadM
import me.maxwin.view.XListV
import android.app.A
import android.content.I
import android.os.AsyncT
import android.os.B
import android.os.L
import android.view.V
import android.widget.AdapterV
import android.widget.T
import android.widget.AdapterView.OnItemClickL
import android.widget.ProgressB
import com.monE
import com.zhy.bean.N
import com.zhy.biz.NewsItemB
import com.zhy.csdndemo.adapter.NewContentA
public class NewsContentActivity extends Activity implements IXListViewLoadMore
private XListView mListV
* 该页面的url
private NewsItemBiz mNewsItemB
private List&News& mD
private ProgressBar mProgressB
private NewContentAdapter mA
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.news_content);
mNewsItemBiz = new NewsItemBiz();
Bundle extras = getIntent().getExtras();
url = extras.getString(&url&);
mAdapter = new NewContentAdapter(this);
mListView = (XListView) findViewById(R.id.id_listview);
mProgressBar = (ProgressBar) findViewById(R.id.id_newsContentPro);
mListView.setAdapter(mAdapter);
mListView.disablePullRefreash();
mListView.setPullLoadEnable(this);
mListView.setOnItemClickListener(new OnItemClickListener()
public void onItemClick(AdapterView&?& parent, View view, int position, long id)
News news = mDatas.get(position - 1);
String imageLink = news.getImageLink();
//Toast.makeText(NewContentActivity.this, imageLink, 1).show();
Intent intent = new Intent(NewsContentActivity.this,ImageShowActivity.class);
intent.putExtra(&url&, imageLink);
startActivity(intent);
mProgressBar.setVisibility(View.VISIBLE);
new LoadDataTask().execute();
public void onLoadMore()
class LoadDataTask extends AsyncTask&Void, Void, Void&
protected Void doInBackground(Void... params)
mDatas = mNewsItemBiz.getNews(url).getNewses();
} catch (CommonException e)
Looper.prepare();
Toast.makeText(getApplicationContext(), e.getMessage(), 1).show();
Looper.loop();
protected void onPostExecute(Void result)
if(mDatas == null)
mAdapter.addList(mDatas);
mAdapter.notifyDataSetChanged();
mProgressBar.setVisibility(View.GONE);
* 点击返回按钮
* @param view
public void back(View view)
接下来看这个Activity中ListView的Adapter
package com.zhy.csdndemo.
import java.util.ArrayL
import java.util.L
import android.content.C
import android.graphics.B
import android.text.H
import android.util.L
import android.view.LayoutI
import android.view.V
import android.view.ViewG
import android.widget.BaseA
import android.widget.ImageV
import android.widget.TextV
import com.nostra13.universalimageloader.core.DisplayImageO
import com.nostra13.universalimageloader.core.ImageL
import com.nostra13.universalimageloader.core.ImageLoaderC
import com.nostra13.universalimageloader.core.assist.ImageScaleT
import com.nostra13.universalimageloader.core.display.FadeInBitmapD
import com.zhy.bean.N
import com.zhy.bean.News.NewsT
import com.zhy.csdndemo.R;
public class NewContentAdapter extends BaseAdapter
private LayoutInflater mI
private List&News& mDatas = new ArrayList&News&();
private ImageLoader imageLoader = ImageLoader.getInstance();
private DisplayImageO
public NewContentAdapter(Context context)
mInflater = LayoutInflater.from(context);
imageLoader.init(ImageLoaderConfiguration.createDefault(context));
options = new DisplayImageOptions.Builder().showStubImage(R.drawable.images)
.showImageForEmptyUri(R.drawable.images).showImageOnFail(R.drawable.images).cacheInMemory()
.cacheOnDisc().imageScaleType(ImageScaleType.EXACTLY).bitmapConfig(Bitmap.Config.RGB_565)
.displayer(new FadeInBitmapDisplayer(300)).build();
public void addList(List&News& datas)
mDatas.addAll(datas);
public int getCount()
return mDatas.size();
public Object getItem(int position)
return mDatas.get(position);
public long getItemId(int position)
public int getItemViewType(int position)
switch (mDatas.get(position).getType())
case NewsType.TITLE:
case NewsType.SUMMARY:
case NewsType.CONTENT:
case NewsType.IMG:
case NewsType.BOLD_TITLE:
return -1;
public int getViewTypeCount()
public boolean isEnabled(int position)
switch (mDatas.get(position).getType())
case NewsType.IMG:
public View getView(int position, View convertView, ViewGroup parent)
News news = mDatas.get(position); // 获取当前项数据
Log.e(&xxx&, news.toString());
ViewHolder holder =
if (null == convertView)
holder = new ViewHolder();
switch (news.getType())
case NewsType.TITLE:
convertView = mInflater.inflate(R.layout.news_content_title_item, null);
holder.mTextView = (TextView) convertView.findViewById(R.id.text);
case NewsType.SUMMARY:
convertView = mInflater.inflate(R.layout.news_content_summary_item, null);
holder.mTextView = (TextView) convertView.findViewById(R.id.text);
case NewsType.CONTENT:
convertView = mInflater.inflate(R.layout.news_content_item, null);
holder.mTextView = (TextView) convertView.findViewById(R.id.text);
case NewsType.IMG:
convertView = mInflater.inflate(R.layout.news_content_img_item, null);
holder.mImageView = (ImageView) convertView.findViewById(R.id.imageView);
case NewsType.BOLD_TITLE:
convertView = mInflater.inflate(R.layout.news_content_bold_title_item, null);
holder.mTextView = (TextView) convertView.findViewById(R.id.text);
convertView.setTag(holder);
holder = (ViewHolder) convertView.getTag();
if (null != news)
switch (news.getType())
case NewsType.IMG:
imageLoader.displayImage(news.getImageLink(), holder.mImageView, options);
case NewsType.TITLE:
holder.mTextView.setText(news.getTitle());
case NewsType.SUMMARY:
holder.mTextView.setText(news.getSummary());
case NewsType.CONTENT:
holder.mTextView.setText(&\u&+Html.fromHtml(news.getContent()));
case NewsType.BOLD_TITLE:
holder.mTextView.setText(&\u&+Html.fromHtml(news.getContent()));
// holder.mTextView.setText(Html.fromHtml(item.getContent(),
// null, new MyTagHandler()));
// holder.content.setText(Html.fromHtml(&&ul&&bold&加粗&/bold&sdfsdf&ul&&,
// null, new MyTagHandler()));
return convertV
private final class ViewHolder
TextView mTextV
ImageView mImageV
我们复写了getViewTypeCount ,&getItemViewType ,isEnabled 因为我们的item的样式不止一种,且为显示图片的那个Item让它可以点击。
最后就是图片展示的Activity:
package com.zhy.
import android.app.A
import android.graphics.B
import android.os.AsyncT
import android.os.B
import android.view.V
import android.widget.ProgressB
import android.widget.T
import com.polites.android.GestureImageV
import com.zhy.csdndemo.util.FileU
import com.zhy.csdndemo.util.H
public class ImageShowActivity extends Activity
private ProgressBar mL
private GestureImageView mGestureImageV
private Bitmap mB
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_image_page);
// 拿到图片的链接
url = getIntent().getExtras().getString(&url&);
mLoading = (ProgressBar) findViewById(R.id.loading);
mGestureImageView = (GestureImageView) findViewById(R.id.image);
new DownloadImgTask().execute();
* 点击返回按钮
* @param view
public void back(View view)
* 点击下载按钮
* @param view
public void downloadImg(View view)
mGestureImageView.setDrawingCacheEnabled(true);
if (FileUtil.writeSDcard(url, mGestureImageView.getDrawingCache()))
Toast.makeText(getApplicationContext(), &保存成功&, Toast.LENGTH_SHORT).show();
Toast.makeText(getApplicationContext(), &保存失败&, Toast.LENGTH_SHORT).show();
mGestureImageView.setDrawingCacheEnabled(false);
class DownloadImgTask extends AsyncTask&Void, Void, Void&
protected Void doInBackground(Void... params)
mBitmap = Http.HttpGetBmp(url);
protected void onPostExecute(Void result)
mGestureImageView.setImageBitmap(mBitmap);
mLoading.setVisibility(View.GONE);
super.onPostExecute(result);
好了,省略了一些辅助类的方法和布局文件。下面看下效果。
好了,上传文件限制2M,没办法录太多。
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:4230388次
积分:32110
积分:32110
排名:第71名
原创:172篇
评论:7067条
长期为您推荐优秀博文、开源项目、视频等,进入还有好玩的等着你,欢迎扫一扫。
请勿重复加群,Thx
文章:11篇
阅读:71675
文章:10篇
阅读:40225
文章:67篇
阅读:1906321
(1)(3)(4)(5)(4)(4)(3)(5)(4)(6)(7)(6)(7)(11)(10)(23)(17)(18)(39)(1)(1)

我要回帖

更多关于 怎么保存word里的图片 的文章

 

随机推荐