分类目录归档:程序生活

Program Life – Web

【转】C++ builder 家用摄像头捕捉图像

我们来开发一个用家用摄像头捕捉图像的小程序。程序的主要代码如下,其中步骤说明将插入到代码当中。

步骤一:

在C++ builder中新建的Form上插入:2个button,一个panel,一个ComboBox和一个SaveDialg

步骤二:编写代码
[code]
//—————————————————————————-
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "vfw.h"         //双击Form后,在代码区先加入vfw头文件。      
//—————————————————————————-
#pragma resource "*.dfm"
#pragma package(smart_init)
TForm1 *Form1;      //加入自定义变量。
HWND hWndC;
CAPDRIVERCAPS CapDrvCaps;
CAPSTATUS CapStatus;
//—————————————————————————-
__fastcall TForm1::TForm1(TComponent *Owner)
: TForm(Owner)
{
}
//—————————————————————————-
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Table1->Open();
}
//—————————————————————————-
void __fastcall TForm1::Button1Click(TObject *Sender)    // 加入启动camere的程序。
{
  char szDeviceName[80];
  char szDeviceVersion[80];
  for (int wIndex=0;wIndex<10;wIndex++)
  {
    if (capGetDriverDescription(wIndex,szDeviceName,sizeof(szDeviceName),szDeviceVersion,sizeof(szDeviceVersion)))
        {
            Camera->Items->Add(szDeviceName);
        }
    }
    if(Camera->Items->Count>0)
        Camera->ItemIndex=0;
    else
    {
        ShowMessage("There is no camera!");
        Close();
    }

//检查视频是否处于实时捕获状态
  if(CapStatus.fLiveWindow==1)
  //CapStatus.fLiveWindow=1表明当前初频已处于实时捕获状态,否则CapStatus.fLiveWindow=0
  {
    ShowMessage("You needn't do it again!");
    return;
  }
  hWndC=capCreateCaptureWindow((LPSTR)"My Capture Window",WS_CHILD | WS_VISIBLE,0,0,160,120,(HWND)Panel2->Handle,Camera->ItemIndex+1);
  //连接设备:
  capDriverConnect(hWndC,0);
  capPreviewRate(hWndC,50); // rate, in milliseconds
  capPreview(hWndC,TRUE); // starts preview
  //获取视频驱动相关性能
  capDriverGetCaps(hWndC,&CapDrvCaps,sizeof(CAPDRIVERCAPS));
  //获取捕获窗口状态
  capGetStatus(hWndC,&CapStatus,sizeof(CAPSTATUS));
  SetWindowPos(hWndC,NULL,0,0,CapStatus.uiImageWidth,CapStatus.uiImageHeight,SWP_NOZORDER | SWP_NOMOVE);
}
//—————————————————————————

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
   if(hWndC)
  {
    capPreview(hWndC,FALSE);
    capDriverDisconnect(hWndC);
  }

}
//—————————————————————————

void __fastcall TForm1::Button2Click(TObject *Sender)    //加入图像保存程序。
{
if(SavePictureDialog1->Execute())
capFileSaveDIB(hWndC,(SavePictureDialog1->FileName+".bmp").c_str());
}
//—————————————————————————

[/code]
步骤三:

运行并测试。

[转]我和我的工程师朋友们

[font=宋体][size=5]其实我们未必算的上是朋友,你知道其实我们常常挂在嘴边的一些词都是泛泛。

我的这些朋友常年在上地城铁与公司之间行色匆匆,无法判断接下来的夜晚他们将要去干些什么,相反从国贸的玻璃房子里出来的那些人倒是昭昭然。

他们大多都长了一张证件照的脸和一颗单核的心,脑子里想着一些奇怪的事情,其中的一位曾经用我无法拒绝的真诚劝说我跟他一起买了一对儿遥控直升飞机,那飞机打买回来以后再也没飞过。

他们中的绝大多数来自传统的理工科院校,对学校各个食堂的菜价了如指掌,也能准确地选择出周边性价比最高的串店,很多人在大三之前从来没有谈过恋爱,但是都惦记过一个无法启齿的姑娘。

在学校里他们是不那么拉风的一群人,只有电脑宕机的时候姑娘们才会在手机里搜索他们的电话号码,每天说不超过十句话可是能在QQ窗口里敲上两千字。

在那些艺术类院校的朋友吃饱喝足拉帮结伙找人去工体的时候,我的工程师朋友宿舍门口都会伸进一个胖脑袋:你选匪啊,别进错图。

他们每天做的工作大概就是写代码,这个世界是属于0和1的,只要是三个步骤以上的事情请不要对他们撒谎,几秒内他们就能拆穿你的逻辑,但是生活中一些习以为常的事情倒可以随便说说,反正他们也不大懂。

朋友们大学毕业的时候都是单身,有一个在珍爱网上注册VIP的朋友兴奋地用了一个钟头给我讲了那个二外教酒店管理的意大利回来的天津姑娘,据说她身材高挑又漂亮。那天下午姑娘要带他去参加和意大利朋友的派对,他捋着白色衬衫的领口说我今天穿的是不是不够正式。

每次他们看见我的创可贴T恤都要围观一阵儿,如果你掏出一个智能手机他们第一句会报出CPU的主频,除了房价他们还关心整个欧洲的政治局势,但奇怪的是对证券期货基金定投一无所知。

我有些不着调的朋友总是喷着吐沫星子开心地谈着他在老家强硬的关系网,软件工程师们却老是自顾自地给我讲他们出生的那个总是泛着白雾的村庄。

他们总是那么地遵守规则,如果凑巧有一条近路能够直达终点但是需要翻越护栏,那么他们一定是那些绕着护栏走的人。

我独自站在导播间门口发呆的时候,他们都会走过来嘘寒问暖:是在看美女吗?这个时候我总是无言以对,我理解他们对漂亮姑娘有一些欲罢不能的记忆。

那些上学时候最瞧不起他们的姑娘人老珠黄的时候总是又会想起他们,她们撇一撇嘴唇都在说:还是找个踏实过日子的吧。

我多么期望我的这些朋友有朝一日事业有成的时候能好好摆她们一道,虽然这个几率太小太小。

我们能听懂同一个讲科学怪人的笑话,我想这是我和他们的共同之处,有时候我也可以理解他们那谨小慎微的生活,因为我也这样的过着,喝酒的时候也能听到一些发自肺腑的话,接不上话茬的时候我大可以微微一笑,因为他们也不是那么在乎。

可能有一天我会换一个行业做另外一种工作游走在另外一种圈子,当我觉得那个世界太夸张的时候,我还会想起我的这些工程师朋友,他们说过的那些可以按F5编译的话我也一直都会记得。
[/font][/size]

Flex跨域数据调用crossdomain

需要在根目录下放置一个crossdomain.xml文件,表面允许其他的地方的Flash可以访问本站的资源
[code]
<?xml version="1.0"?>      
<!DOCTYPE cross-domain-policy  SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">    
<cross-domain-policy>    
     <allow-access-from domain="*" />    
</cross-domain-policy>  
[/code]

饭否没有了,自己建一个

[size=5]饭否被关闭已经很久了,一直也没有开启的迹象,没有了饭否感觉很不方便。我喜欢饭否的两个很大原因是,一是可以最快速的获得新闻,第二则是可以随时记录自己的一些东西,很方便。
饭否没有了,感觉不适应,我知道现在有些开源的微博客系统了,但是不知道具体的名字,今晚搜索了一下,找到一个合适的,叫[url=http://www.9italk.com/]EasyTalk[/url],是用php开发的,比较强大,界面很清爽,安装之后看了后台管理,也很方便
欢迎大家去我搭建的这个微博客:)
地址是:[url=http://m.ldsea.cn/]http://m.ldsea.cn/[/url][/size]

NetBeans打包

最近在写一个小软件,用NetBeans开发的,说实话比较起来我更喜欢Eclipse,NetBeans使用起来总是很别扭,每次只是开发一个GUI的东东时,才会用NetBeans,好了,废话不多说了,使用Netbeans时,如果我们使用了第三方的jar包,在生成jar文件(点右键生成,或者直接按F11)时,默认是不会添加第三方的jar包的,生成的jar包是在dist目录下,同时生成一个lib目录,所需要的第三方jar包会生成到这个目录下。这个是让我很讨厌的,我希望是仅生成一个jar包,这样很方便,而且我后期会把它打包成exe的一个文件发布,如果第三发jar包在另一个目录的话,就很不方便了。
下面是在打包的时候将第三方jar包一起打入一个jar包的方法:
在工程目录下有个build.xml文件,修改这个文件添加如下代码:
[code]
        <target name="run" depends="TestHello-impl.jar">
            <exec dir="bin" executable="launcher.exe">
                <arg file="${dist.jar}"/>
                <ZIPFILESET src="${libs.swing-layout.classpath}" />
                <ZIPFILESET src="${libs.commons-codec.classpath}" />
                <ZIPFILESET src="${libs.commons-httpclient.classpath}" />
                <ZIPFILESET src="${libs.commons-logging.classpath}" />
            </exec>
        </target>
[/code]
其中TestHello是你的工程的名字,下面的ZIPFILESET是你需要一起打包的jar文件

[转载]HttpClient学习-字符编码、cookie处理部分

1、字符编码(character encoding)

  一个HTTP协议的请求或应答的头部(在http协议中,数据包分为两部分,一部分是头部,由一些名值对构成,一部分是主体(body),是真正传办理的数据(如HTML页面等)),必须以US-ASCII编码,这是因为头部不传数据而只描述被要传输的数据的一些信息,一个例外是cookie,它是数据但是通过头部进行传输的,所以它也要用US-ASCII编码。
  HTTP数据包的主体部分,可以用任何一种方式进行编码,默认是ISO-8859-1,具体可以用头部字段Content-Type指定。可以利用 addRequestHeader方法,设定编码方式;用 getResponseCharSet取得编码方式。对HTML或XML等类型的文档,它们的本身的Content-Type也可以指定编码方式,主要区分两者的作用范围以得到正确实的解码。
  URL的编码标准,由RFC1738指定为,只能是由可打印8位/字节的us-ascii字符组成,80-ff不是us-ascii字符,而00-1F是控制字符,这两个区域中用的字符都须加以编码(encoded)。
  
2、Cookies

   HttpClient能自动管理cookie,包括允许服务器设置cookie并在需要的时候自动将cookie返回服务器,它也支持手工设置 cookie后发送到服务器端。不幸的是,对如何处理cookie,有几个规范互相冲突:Netscape Cookie 草案, RFC2109, RFC2965,而且还有很大数量的软件商的cookie实现不遵循任何规范. 为了处理这种状况,HttpClient提供了策略驱动的cookie管理方式。HttpClient支持的cookie规范有:
Netscape cookie草案,是最早的cookie规范,基于rfc2109。尽管这个规范与rc2109有较大的差别,这样做可以与一些服务器兼容。

rfc2109,是w3c发布的第一个官方cookie规范。理论上讲,所有的服务器在处理cookie(版本1)时,都要遵循此规范,正因如此,HttpClient将其设为默认的规范。遗憾的是,这个规范太严格了,以致很多服务器不正确的实施了该规范或仍在作用Netscape规范。在这种情况下,应使用兼容规范。

兼容性规范,设计用来兼容尽可能多的服务器,即使它们并没有遵循标准规范。当解析cookie出现问题时,应考虑采用兼容性规范。

   RFC2965规范暂时没有被HttpClient支持(在以后的版本为会加上),它定义了cookie版本2,并说明了版本1cookie的不足,RFC2965有意有久取代rfc2109.
  在HttpClient中,有两种方法来指定cookie规范的使用,
HttpClient client = new HttpClient();
client.getState().setCookiePolicy(CookiePolicy.COMPATIBILITY);
这种方法设置的规范只对当前的HttpState有效,参数可取值CookiePolicy.COMPATIBILITY,CookiePolicy.NETSCAPE_DRAFT或CookiePolicy.RFC2109。

System.setProperty(“apache.commons.httpclient.cookiespec”, “COMPATIBILITY”);
此法指的规范,对以后每个新建立的HttpState对象都有效,参数可取值”COMPATIBILITY”,”NETSCAPE_DRAFT”或”RFC2109″。
  常有不能解析cookie的问题,但更换到兼容规范大都能解决。
  
3、使用HttpClient遇到问题怎么办?

用一个浏览器访问服务器,以确认服务器应答正常

如果在使代理,关掉代理试试

另找一个服务器来试试(如果运行着不同的服务器软件更好)

检查代码是否按教程中讲的思路编写

设置log级别为debug,找出问题出现的原因

打开wiretrace,来追踪客户端与服务器的通信,以确实问题出现在什么地方

用telnet或netcat手工将信息发送到服务器,适合于猜测已经找到了原因而进行试验时

将netcat以监听方式运行,用作服务器以检查httpclient如何处理应答的。

利用最新的httpclient试试,bug可能在最新的版本中修复了

向邮件列表求帮助

向bugzilla报告bug.

[转载]httpclient的cookie,编码与上传

最近一直试图用httpClient做点自动化的工作,不过现在看来并没有想象中的那么轻松。

实际上登录一个网站,访问某个特点的页面,发表一篇文章,上传一些文件,并不是一个简单的事情。
HttpClient的基本使用因为发布的代码中带有几个例子,应该算是不难掌握的事情。下面我说下我遇到的几个问题。

1,登陆验证图片问题
首先登录的时候网站如果不想你对它编程的化通常都会设计一个验证图片,这个技术现在已经如此的易于使用,以至于随便到哪里都能找到代码来直接使用。对于验证图片的,现在还苦于无计可施状态。

2,笨蛋Cookie问题:
如果你要发送多个cookie,其实可以这样发的:

[code]state.addCookies (new Cookie[]{
            new Cookie(" www.aaa.com","popped","yes","/",new Date(2006,12,8),false),
            new Cookie(" www.aaa.com","rtime","2","/",new Date(2006,12,8),false),
            new Cookie(" www.aaa.com","ltime","1149940477953","/",new Date(2006,12,8),false),
            new Cookie(" www.aaa.com ","cnzz02","1","/",new Date(2006,12,8),false),
        });[/code]
但是截包就会发现,httpclient会在header里构件多个cookie项,每一项只含有一个cookie,这同IE是不一样的。IE和Firefox会把所有的cookie打包成一个,然后在这个cookie里按照分号把每一项隔开,中间有个空格。
所以如果用httpclient,还想让cookie正常的话,请使用下面这种形式:

[code]String cookies = "yes; rtime=2; ltime=1149940477953; cnzz02=1";
state.addCookie(new Cookie("blog.aaa.com","poped",cookies,"/",new Date(2006,12,8),false)); [/code]
3,编码问题:

httpClient处理编码并不像IE或FireFox那么智能,httpclient记不住上次会话的编码,这样如果默认不是ISO-8859-1的话,那都要在Content-Type里边指定,其实指定的方法也很简单。
本来要提交的是form,默认按照application/x-www-form-urlencoded来发送,在IE里边发送的话截包可以看到,报文中也就指定了这样一个Content-Type,但是人家IE已经把报文的内容按照会话的编码转换好了。而httpclient不行,它并不知道怎么转化,那么你没有设定转换的charset的话,它就按照Charset=ISO-8859-1转换了。这一点上Httpclient应该再改进一下,因为记住server发过来的页面编码是件很简单的事情。只要将类似于”Content-Type: text/html; charset=utf-8″这样的头保存一下状态就可以了。
为了弥补httpclient这一点的傻瓜表现,我们只好每次都手工设置一下喽:
postMethod.addRequestHeader(“Content-Type”,”application/x-www-form-urlencoded; charset=UTF-8″);

4,上传文件问题:

httpClient并不能很好的模拟文件上传。
首先是对于文件类型的识别,IE可以做到按照文件类型分别选择不同的Content-type进行发送,而httpclient就需要我们自己设定,这样如果对一个目录进行自动化上传的话就必须知道该目录下所有文件的类型,以及对应的charset,然后再设置FilePart的时候逐一判断文件扩展名,以赋给不同的content-type和charset,对于一些网页编码是gb2312,而另外一些网页编码是utf-8则会更加麻烦。
其次是如果发送的multiPartPost报文中除了FilePart以外,还需要一些form中的其他input的信息,又是一件很麻烦的事情。刚开始的时候我以为像一般的PostMethod一样,使用PostMethod.addParameters()就可以了,后来才发现这个 MultiPartPost跟那个Post根本就是两个不同的Post。虽然从网页上看都是Form,且只是在input的类型上 MultiPartPost包含一个file类型的input,其他完全一样,但实际上在httpClient中是完全不同的两套方案。对于 MultiPartPost而言,不能用addParameters(),而要使用

[code]someMultiPartPost.setRequestEntity(
     new MultipartRequestEntity(
         new Part[] { art1,part2,part3,part4},
                    someMultiPartPost.getParams())
);[/code]

这种形式。对于要上传的File,那么这些part就是FilePart对象,如果是跟随form的其他input,那么这些part就是 StringPart。这样发出去的报文才是:Content-Disposition: form-data; name=”newFolderName”这种形式。

总结起来,其实也不能怪人家HttpClient,天下间哪有那么多容易做到的事情,尤其是面对Http这样一个说来不算简单的协议。
实际上像这种开源已久的东西,已经有了不少的文档,虽然有时候不太好找,但很多问题还是能够猜或者试出来,毕竟相对比较成熟,而且遵循这rfc来做的。就像我在水母上问问题,有人说的那样,世界上有什么能模拟的像IE一样呢,也不能拿IE的标准要求HttpClient。
我现在的感觉是要想用好HttpClient,或者类似的别的什么工具(其他我就不知道了,有知道类似工具的麻烦告诉我一声),其实还是要把协议吃透,这样一旦遇到什么问题,才知道问题出在哪里,否则就只有郁闷的份儿了。
昨天去Apache的网站,看到一个新的Project叫做HttpComponent从common里边脱离出来,包含了HttpCore, HttpClient,HttpAsync,HttpNIO,HttpCookie,HttpConn,看不出到底想做成什么样子,不过HttpCore 4.0 alpha2已经发布了,以后HttpClient用起来可能又有新的变化了。

一周的时间,用的不是很多,有说得不妥的地方,还请大家指正。

[转载]HttpClient的下载

下载页面文件

[code]import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.*;

public class GetPageExample {
public static void main( String[] args ) {
   if( args.length() == 0 ) {
    System.out.println( "Usage: java GetPageExample URL" );
    System.exit( 0 );
   }
   String url = args[ 0 ];
   try {
    HttpClient client = new HttpClient();
    GetMethod method = new GetMethod( url );
    method.setFollowRedirects( true );

    // Execute the GET method
    int statusCode = client.executeMethod( method );
    if( statusCode != -1 ) {
      String contents = method.getResponseBodyAsString();
      method.releaseConnection();
      System.out.println( contents );
    }
   }
   catch( Exception e ) {
    e.printStackTrace();
   }
}
}[/code]
下载文件

[code]import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.*;

public class GetFileExample {
public static void main( String[] args ) {
   if( args.length() < 2 ) {
    System.out.println( "Usage: java GetFileExample URL filename" );
    System.exit( 0 );
   }
   String url = args[ 0 ];
   try {
    HttpClient client = new HttpClient();
    GetMethod method = new GetMethod( url );
    method.setFollowRedirects( true );

    // Execute the GET method
    int statusCode = client.executeMethod( method );
    if( statusCode != -1 ) {
      System.out.println( "Reading file" );
      InputStream is = method.getResponseBodyAsStream();
      BufferedInputStream bis = new BufferedInputStream( is );
      FileOutputStream fos = new FileOutputStream( filename );
      byte[] bytes = new byte[ 8192 ];
      int count = bis.read( bytes );
      while( count != -1 && count <= 8192 ) {
       System.out.print( "-" );
       fos.write( bytes, 0, count );
       count = bis.read( bytes );
      }
      if( count != -1 ) {
       fos.write( bytes, 0, count );
      }
      fos.close();
      bis.close();
      method.releaseConnection();
      System.out.println( "\nDone" );    
    }
   }
   catch( Exception e ) {
    e.printStackTrace();
   }
}
}[/code]

[转载]使用httpclient下载需要登录的网页

[code]import java.io.IOException;

import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.cookie.*;
import org.apache.commons.httpclient.methods.*;

public class JClientLoginTest {
public static void main(String[] args) throws HttpException, IOException {
  HttpClient client = new HttpClient();
  client.getHostConfiguration().setHost( "bbs.cpcw.com" , 80, "http" );

  PostMethod post = new PostMethod( "/logging.php?action=login" );
  NameValuePair name = new NameValuePair( "username" , "dongle2001" );
  NameValuePair pass = new NameValuePair( "password" , "1a9i8h1a" );
  NameValuePair quest = new NameValuePair( "questionid" , "0" );
  NameValuePair answer = new NameValuePair( "answer" , "" );[www.iocblog.net 来源]
  NameValuePair cookietime = new NameValuePair( "cookietime" , "315360000" );
  NameValuePair submit = new NameValuePair( "loginsubmit" , "提 &nbsp; 交" );
  post.setRequestBody( new NameValuePair[]{name,pass,quest,answer,cookietime,submit});
  int status = client.executeMethod(post);
  post.releaseConnection();

  CookieSpec cookiespec = CookiePolicy.getDefaultSpec();
  Cookie[] cookies = cookiespec.match("bbs.cpcw.com", 80, "/" , false , client.getState().getCookies());
  if (cookies.length == 0) {
     System.out.println( "None" );
   } else {
   for ( int i = 0; i < cookies.length; i++) {
      System.out.println(cookies[i].toString());
   }
  }

  GetMethod get=new GetMethod("/viewthread.php?tid=883329");
  client.executeMethod(get);
  String response = new String(get.getResponseBodyAsString().getBytes("8859-1"));
  System.out.println(response);
  get.releaseConnection();

}
}[/code]

用wap浏览器在饭否网发图片

[size=4][color=#0000FF]如果你想在饭否网发布图片,又不想花费手机费来发彩信,用这个在线wap浏览器就可以了[/color][/size][url=http://w2w.spforum.net/]http://w2w.spforum.net/[/url]
[size=4][color=#0000FF]叫上方网wap浏览器,上方宝剑的意思?[/color][/size]
[img][attach]177[/attach][/img]
[size=4][color=#0000FF]在输入栏输入饭否网的wap地址: wap.fanfou.com
就可以看到饭否的手机登录界面了[/color][/size]
[img][attach]178[/attach][/img]
[size=4][color=#0000FF]下面有个“发照片”的链接,点击一下,就可以把本地电脑上的图片发到饭否网了[/color][/size]
[img][attach]179[/attach][/img]
[size=5][color=#FF0000]还不去试试?[/color][/size]