位置:首页 » 技术 » 使用Android NDK编译OpenCV应用

使用Android NDK编译OpenCV应用

日期:2011-07-31 阅读:0num
Advertisement

OpenCV 在Android 中的应用

使用Android NDK 编译so 库

简介

在linuxt 系统下使用OpenCV2.3 + NDK R6 编译OpenCV 人脸检测应用

准备

Android NDK ( r5 或更高版本) http://developer.android.com/sdk/ndk/index.html

OpenCV Android 包http://sourceforge.net/projects/opencvlibrary/files/opencv-android/2.3/

cmake( 可选,替代NDK) http://www.cmake.org/

注:http://code.google.com/p/android-opencv/ 网站上说要使用crystax ndk r4 代替NDK 。估计可能是对于较旧的Android 版本需要这样。如果NDK 无法编译,请尝试使用crystax ndk r4 编译。

OpenCV 设置

从网站上下载OpenCV 2.3.0 for Android 后,解压到某个目录,如~/ 目录下

设置OPENCV_PACKAGE_DIR 环境变量

$ export OPENCV_PACKAGE_DIR=~/enCV-2.3.0/

新建一个Android 工程

在eclipse 中新建一个android 工程如study.opencv ,并且在工程根目录下新建一个名为jni 的目录。将下载的android-ndk-r6 解压到某个目录下,如~/

从~/android-ndk-r6/sample 下某个sample 中拷贝Android.mk, Application.mk 到study.opencv/jni 目录

设置编译脚本

在Android.mk 中,include $(CLEAR_VARS) 后面,加入下行

include $(OPENCV_PACKAGE_DIR)/$(TARGET_ARCH_ABI)/share/opencv/OpenCV.mk

如果应用支持ARM NEON 那么还需要加入以下行

include $(OPENCV_PACKAGE_DIR)/armeabi-v7a-neon/share/opencv/OpenCV.mk

LOCAL_ARM_NEON := true

在Application.mk 中加入以下行

APP_STL := gnustl_static

APP_CPPFLAGS := -frtti -fexceptions

注:关于Android.mk 与Application.mk 的详细说明,请参考ndk/docs 下Android-mk.html 和Application-mk.html 。

Java 层定义native 接口

新建study.opencv.FaceRec 类,定义一个人脸检测的本地接口

/**

* detect front face from image.

*

* @param xml

* opencv haarcascade xml file path

* @param infile

* input image file path

* @param outfile

* output image file path

*/

public native void detect(String xml, String infile, String outfile);

生成jni 头文件

使用javah 命令生成jni 头文件

$ cd ~/workspace/study.opencv/bin

$ javah study.opencv.FaceRec

会在bin 目录生成一个study_opencv_FaceRec.h 文件。将此文件拷贝到../jni 目录中

注:如果接口有变更,请先手动删除生成的.h 文件。以防止一些意外的错误。

在c 层实现图像人脸检测

在jni 目录中使用文本编辑器新建一个facedetect.cpp ,实现图像人脸检测

Cpp代码

#include "cv.h"

#include "highgui.h"

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <assert.h>

#include <math.h>

#include <float.h>

#include <limits.h>

#include <time.h>

#include <ctype.h>

#include <android/log.h>

#include <study_opencv_FaceRec.h>

#include <jni.h>

#define LOG_TAG "opencv_face_detect"

#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)

#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)

static CvMemStorage* storage = 0;

static CvHaarClassifierCascade* cascade = 0;

void detect_and_draw( IplImage* image );

const char* cascade_name =

"haarcascade_frontalface_alt.xml";

/* "haarcascade_profileface.xml";*/

/*int captureFromImage(char* xml, char* filename);*/

char* jstring2String(JNIEnv*, jstring);

int captureFromImage(char* xml, char* filename, char* outfile)

{

LOGI("begin: ");

// we just detect image

// CvCapture* capture = 0;

IplImage *frame, *frame_copy = 0;

const char* input_name = "lina.png";

if(xml != NULL)

{

cascade_name = xml;

}

if(filename != NULL)

{

input_name = filename;

}

LOGI("xml=%s,filename=%s", cascade_name, input_name);

// load xml

cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );

LOGI("load cascade ok ? %d", cascade != NULL ? 1 : 0);

if( !cascade )

{

LOGI("ERROR: Could not load classifier cascade\n" );

// I just won't write long full file path, to instead of relative path, but I failed.

FILE * fp = fopen(input_name,"w");

if(fp == NULL){

LOGE("create failed");

}

return -1;

}

storage = cvCreateMemStorage(0);

// cvNamedWindow( "result", 1 );

IplImage* image = cvLoadImage( input_name, 1 );

if( image )

{

LOGI("load image successfully");

detect_and_draw( image );

// cvWaitKey(0);

if(outfile != NULL)

{

LOGI("after detected save image file");

cvSaveImage(outfile, image);//把图像写入文件

}

cvReleaseImage( &image );

}

else

{

LOGE("can't load image from : %s ", input_name);

}

}

void detect_and_draw( IplImage* img )

{

static CvScalar colors[] =

{

{{0,0,255}},

{{0,128,255}},

{{0,255,255}},

{{0,255,0}},

{{255,128,0}},

{{255,255,0}},

{{255,0,0}},

{{255,0,255}}

};

double scale = 1.3;

IplImage* gray = cvCreateImage( cvSize(img->width,img->height), 8, 1 );

IplImage* small_img = cvCreateImage( cvSize( cvRound (img->width/scale),

cvRound (img->height/scale)),

8, 1 );

int i;

cvCvtColor( img, gray, CV_BGR2GRAY );

cvResize( gray, small_img, CV_INTER_LINEAR );

cvEqualizeHist( small_img, small_img );

cvClearMemStorage( storage );

if( cascade )

{

double t = (double)cvGetTickCount();

CvSeq* faces = cvHaarDetectObjects( small_img, cascade, storage,

1.1, 2, 0/*CV_HAAR_DO_CANNY_PRUNING*/,

cvSize(30, 30) );

t = (double)cvGetTickCount() - t;

LOGI( "detection time = %gms\n", t/((double)cvGetTickFrequency()*1000.) );

for( i = 0; i < (faces ? faces->total : 0); i++ )

{

CvRect* r = (CvRect*)cvGetSeqElem( faces, i );

CvPoint center;

int radius;

center.x = cvRound((r->x + r->width*0.5)*scale);

center.y = cvRound((r->y + r->height*0.5)*scale);

radius = cvRound((r->width + r->height)*0.25*scale);

cvCircle( img, center, radius, colors[i%8], 3, 8, 0 );

}

}

// cvShowImage( "result", img );

cvReleaseImage( &gray );

cvReleaseImage( &small_img );

}

JNIEXPORT void JNICALL Java_study_opencv_FaceRec_detect

(JNIEnv * env, jobject obj, jstring xml, jstring filename, jstring outfile)

{

LOGI("top method invoked! ");/*LOGI("1");

char * c_xml = (char *)env->GetStringUTFChars(xml, JNI_FALSE);

LOGI("char * = %s", c_xml);

if(c_xml == NULL)

{

LOGI("error in get char*");

return;

}

char * c_file = env->GetStringCritical(env, filename, 0);

if(c_xml == NULL)

{

LOGI("error in get char*");

return;

}

captureFromImage(c_xml, c_file);

env->ReleaseStringCritical(env, xml, c_xml);

env->ReleaseStringCritical(env, file_name, c_file);

*/

captureFromImage(jstring2String(env,xml), jstring2String(env,filename), jstring2String(env,outfile));

}

//jstring to char*

char* jstring2String(JNIEnv* env, jstring jstr)

{

if(jstr == NULL)

{

LOGI("NullPointerException!");

return NULL;

}

char* rtn = NULL;

jclass clsstring = env->FindClass("java/lang/String");

jstring strencode = env->NewStringUTF("utf-8");

jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");

jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr, mid, strencode);

jsize alen = env->GetArrayLength(barr);

jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);

if (alen > 0)

{

rtn = (char*)malloc(alen + 1);

memcpy(rtn, ba, alen);

rtn[alen] = 0;

}

env->ReleaseByteArrayElements(barr, ba, 0);

LOGI("char*=%s",rtn);

return rtn;

}

Android.mk:

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

include $(OPENCV_PACKAGE_DIR)/$(TARGET_ARCH_ABI)/share/opencv/OpenCV.mk

LOCAL_MODULE := facedetect

LOCAL_CFLAGS := -Werror

LOCAL_SRC_FILES := \

facedetect.cpp \

LOCAL_LDLIBS := -llog

include $(BUILD_SHARED_LIBRARY)

Application.mk:

APP_ABI := armeabi armeabi-v7a

APP_PLATFORM := android-10

APP_STL := gnustl_static

APP_CPPFLAGS := -frtti -fexceptions

使用NDK 进行编译

在工程jni 目 录 下 执 行ndk-build

$ cd ~/workspace/study.opencv/jni

$ ~/android-ndk-r6/ndk-build.

如果 编译 成功, 则 会在工程下面生成libs/armeabi/facedetect.so 库 了.

如有 编译 失 败 , 请 根据提示修改 错误

调用JNI 接口

将opencv 人 脸检测 要用到的xml 文件( 位于OpenCV-2.3.0/armeabi/share/opencv/haarcascades/ 目录下) 及 图 像文件使用DDMS push 到data/data/study.opencv/files 目 录 中。

在activity 中新建一个 线 程, 调 用FaceRec#detect 方法。

@Override

public void onCreate(Bundle savedInstanceState) {

super .onCreate(savedInstanceState);

setContentView(R.layout. main );

final FaceRec face = new FaceRec();

new Thread() {

@Override

public void run() {

face.detect(

"/data/data/study.opencv/files/haarcascade_frontalface_alt2.xml" ,

"/data/data/study.opencv/files/wqw1.jpg" ,

"/data/data/study.opencv/files/wqw1_detected.jpg" );

}

}.start();

}

运行结果

经测试,对png,jpg,bmp图片正确识别人脸,不过速度太慢了。

相关文章
  • 施用Android NDK编译OpenCV应用

    使用Android NDK编译OpenCV应用 OpenCV 在 Android 中的应用 使用 Android NDK 编译 so 库 简介 在 linuxt 系统下使用 OpenCV2.3 + NDK R6 编译 OpenCV 人脸检测应用 准备 Android NDK ( r5 或更高版本 ) http://developer.android.com/sdk/ndk/index.html OpenCV Android 包 http://sourceforge.net/projects/op

  • 使用Android NDK编译OpenCV应用

    OpenCV 在Android 中的应用 使用Android NDK 编译so 库 简介 在linuxt 系统下使用OpenCV2.3 + NDK R6 编译OpenCV 人脸检测应用 准备 Android NDK ( r5 或更高版本) http://developer.android.com/sdk/ndk/index.html OpenCV Android 包http://sourceforge.net/projects/opencvlibrary/files/opencv-android

  • android - NDK 编译环境筹建

    android -- NDK 编译环境搭建 Android NDK 是运行于Android 平台上的Native Development Kit 的缩写,通过通过NDK 调用C 或C++ 本地代码.为了能够在 eclipse 上直接编译C++.JAVA代码,解决编译中的错误,最后再上实现硬件环境上调试提供方便,提高开发效率,那么就很有必要搭建此工作环境. 一.需要先行下载的工具(以我自已的开发环境为例) eclipse版本: eclipse-cpp-helios-SR1-win32.zip ND

  • 解决不使用Android NDK编译的bin文件No such file or directory有关问题

    解决不使用Android NDK编译的bin文件No such file or directory问题 使用板子的交叉编译工具链,自己做Makefile来编译一个二进制文件,adb push到板子上运行. 会出现No such file or directory问题. 明明该文件是存在的,为什么会出现这个问题呢? 文件是存在,但是该文件所需要的一些库文件,是不存在的.这个时候就需要静态链接. 在Makefile中增加一行 LDFLAGS += --static 在编译可执行文件的命令中,比如 2

  • windows上搭建android NDK编译环境快速搭建

    windows下搭建android NDK编译环境快速搭建 参考:http://www.cnblogs.com/luxiaofeng54/archive/2011/08/13/2136982.html 1.Android 开发环境搭建: 1)JDK: 2)Eclipse: 3) Android SDK: 4)安装 ADT: 2.下载安装Android NDK: http://developer.android.com/ 3.下载安装cygwin: 4.配置NDK环境变量: Cyngwin bas

  • android NDK编译(导入).a资料和编译多个so文件

    android NDK编译(导入).a文件和编译多个so文件 一.编译一个静态库 libstatic_android.a LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := static_android LOCAL_SRC_FILES := libstatic_android.a include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODUL

  • 在Ubuntu顶用Android NDK编译FFmpeg 在Ubuntu顶用Android NDK编译FFmpeg

    在Ubuntu中用Android NDK编译FFmpeg 原链接:http://www.cnblogs.com/scottwong/archive/2010/12/17/1909455.html 最近在做 Android 上的项目,我被恶心的一塌糊涂.本以为 Java 是 Android 上的一等公民,结果深入学习之后才发现,Java 在 Android 上 就是个做 UI 的,除此之外无论想干什都得用 C 语言去实现.Android 一个非常糟糕差劲的操作系统,甚至连 Windows Mobi

  • android NDK编译多个so资料

    android NDK编译多个so文件 android编译系统的makefile文件Android.mk写法如下 (1)Android.mk文件首先需要指定LOCAL_PATH变量,用于查找源文件.由于一般情况下 Android.mk和需要编译的源文件在同一目录下,所以定义成如下形式: LOCAL_PATH:=$(call my-dir) 上面的语句的意思是将LOCAL_PATH变量定义成本文件所在目录路径. (2)Android.mk中可以定义多个编译模块,每个编译模块都是以include $

  • Android NDK 编译 简略示例 之 HelloWord

    Android NDK 编译 简单示例 之 HelloWord 前面,在win7用cygwin上进行NDK的编译,确实发现有点麻烦,要配置很多环节. 还有另一种更简单的方法.就是直接在ADT上面配置即可,非常方便实用. 一.首先到官方下载最新的NDK解压到指定地方即可. 二.打开ADT, 1.Project 2.Properties 3.Builders---New... 4.Program 5.写一下项目名把 6.Main下面Location 选择Browser FIle System..选择

  • Android NDK 编译FFmpeg(不需要复杂的环境变量设立)

    Android NDK 编译FFmpeg(不需要复杂的环境变量设置) 环境: CentOS6.2--64位 借鉴:https://vec.io/posts/how-to-build-ffmpeg-with-android-ndk 在根目录下创建work文件夹:cd / && mkdir work a) 先把要用到的安装包下载到本地: FFmpeg:git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg Android NDK:(我下载的版本是

  • Android NDK编译已有的C++实现的协议库文件-

    Android NDK编译已有的C++实现的协议库文件--求助 Android.mk已经写好,NDK也已经配置好.自己写的代码可以用JNI 调用本地方法,但是调用一个用C/C++ 实现的协议库的时候却没有NDK的编译信息,当然也没有产生预期的.so文件.有没有遇到同样问题的大神呢?求助 >>>>> --cut-- 不知道这个对你有没有用:http://blog.csdn.net/qq_16064871/article/details/45110909 --cut-- LOCA

  • android ndk编译C程序在真机上运行有关问题

    android ndk编译C程序在真机上运行问题 本人用android-ndk-r8b编译了一个C程序,然后push到anroid4.2.2的机子上,./xxx运行这个C程序的时候提示[1] + Stopped (signal),然后就停止了,这中错误提示是啥意思啊?求大神指点一下!我这个程序在Linux操作系统上跑是能正常运行的. --cut-- 你得用NDK的编译工具编译的吧. 看下面这么多.. arm-linux-androideabi-addr2line arm-linux-androi

  • android NDK编译(导入).a文件和编译多个so文件

    一.编译一个静态库 libstatic_android.a LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := static_android LOCAL_SRC_FILES := libstatic_android.a include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := fpdfembedsdk LOCAL_SRC_FIL

  • Android NDK 编译FFmpeg(不需要复杂的环境变量设置)

    环境: CentOS6.2--64位 在根目录下创建work文件夹:cd / && mkdir work a) 先把要用到的安装包下载到本地: FFmpeg:git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg 一定要看好下载对应本地系统的软件包版本. 创建好的目录结构是:work/ffmpeg work/android-ndk-r8b b)配置环境变量:(可以省略) export ANDROID_NDK_HOME=/work/androi

  • 解决不使用Android NDK编译的bin文件No such file or directory问题

    使用板子的交叉编译工具链,自己做Makefile来编译一个二进制文件,adb push到板子上运行. 会出现No such file or directory问题. 明明该文件是存在的,为什么会出现这个问题呢? 文件是存在,但是该文件所需要的一些库文件,是不存在的.这个时候就需要静态链接. 在Makefile中增加一行 LDFLAGS += --static 在编译可执行文件的命令中,比如 26 LDFLAGS += --static 27 $(EXEC): $(LIB) main.c 28 $

  • [原]非常实用一段Android NDK编译脚本用于编译C/C++文件

    作用: 1.遍历C/C++源文件中的每个目录 2.再遍历每个目录下的C/C++文件,加入到LOCAL_SRC_FILES 3.include需要引用的头文件目录 4.链接必须的lib文件 5.生成动态/静态库 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := dlna APP_SUBDIRS := $(patsubst $(LOCAL_PATH)/%, %, $(shell find $(LOCAL_PATH)/

  • Android NDK 交叉编译 FFMPEG 及使用JNI接口

    网上有很多介绍 Android NDK 编译 ffmpeg的文章, 都相对比较繁琐, 需要制作 Android.mk 和 Application.mk 文件 , 其实NDK就是个交叉编译工具而已,直接使用 ./configure 进行配置就行. Android NDK 交叉编译 FFMPEG, 使用下面的命令比较简单: ./configure --sysroot=/home/android-ndk-r6b/platforms/android-8/arch-arm/ --enable-cross-

  • 使用NDK编译含JNI的Android项目常见有关问题解决方案

    使用NDK编译含JNI的Android项目常见问题解决方案 有时候,自己下载的或者拷贝过来的JNI项目出现莫名错误,通常是找不到头文件,可能解决方案如下: Removing the C nature: The only way I could find to reliably removed the C nature from the project was by hand editing Eclipse's .project file for the project. Close the Ec

  • android NDK开发、编译、调试环境筹建与操作入门 android NDK开发、编译、调试环境筹建与操作入门

    android NDK开发.编译.调试环境搭建与操作入门 前话 现在越来越多的应用开发.场景会用到NDK,NDK的开发环境和工具也可谓是"日新月异",Googleg还是比较给力,时至今日ADT已经发布了21.0.1,实际上从20.0.3已经对我们需要使用的NDK有了比较好的支持了,使用Eclipse可以直接断点NDK代码. 以前似乎我们只能通过打日志或者在其它工具如VS.Xcode下写测试工程来调试,以及使用神话般的GDB来调试,搭建调试环境算是程序调试过程中一点点雕虫小技吧.不废话,

  • Android NDK 设立编译模式debug和release

    Android NDK 设置编译模式debug和release 原文:http://stackoverflow.com/questions/14564918/android-ndk-release-build Unless you have created the Application.mk or defined your application as debuggable inside the AndroidManifest.xml you don't have to do anything

最新文章
  • 招聘 PHP 学徒(实习生)免费培训

    ET 开源 WEB 项目实战,一起写点有意思的东西 教授知识体系: Linux , Git,PHP,MySQL,HTML5 感兴趣请联系 QQ . 3167814180 --cut-- maxsec在2016-05-09 10:37:26回答到: 又说招聘,又说免费...醉了... bdbai在2016-05-09 10:37:26回答到: 你是贴吧搬来的救()星()吗? lshero在2016-05-09 10:37:26回答到: 我司实习生据说一天 200 元 youling在2016-05

  • 送一张电影票《杀破狼 2》华谊兄弟望京店中午 12:45

    被坑了.买错场次却不能退换.再也不用支付宝买票了.在望京的想看的筒子留下联系方式.我把取票码发给你.电影院在望京华彩店家乐福旁边. --cut-- yaoyuan1072在2016-05-09 03:07:02回答到: 已送出-

  • [再发一次] .club 首年只要 1 元, 免费 whois 隐藏, 提供 dns 解析,支持二步验证

    访问 xz.com 即可注册 限制注册5000个,先到先得.再发一次是因为已经快达到5000个. 优惠期间每个用户只允许注册一个.club域名. 活动时间:6月16日到7月15日. .club续费费用为80元, whois隐藏续费免费. 利益冲突: 我是这家公司的员工 --cut-- jimmy在2016-05-09 08:44:30回答到: 闽ICP备... 不要跟我说,你们是易名中国旗下的. moliliang在2016-05-09 08:44:30回答到: 锐壳也有域名卖...= =! p

  • 吃蔬菜避开九个误区 吃蔬菜避开九个误区

    蔬菜是营养丰富的食物,含有的维生素的含量是非常的高的,所以我们每天可以吃一些蔬菜,来给身体补足维生素,但是我们也要正确的吃蔬菜,我们吃蔬菜一定要避开这9个误区. 误区一:先切后洗 很多人在清洗蔬菜的时候,都会选择先切好再洗,他们认为这样这样才能够将蔬菜洗干净. 但是,你知道吗?蔬菜中许多营养素及有益物质都是水溶性的,切细切小后的蔬菜在洗涤过程中会使营养物质大量流失于水中.这样我们吃蔬菜就达不到想要的补充身体营养元素的目的,正确的方法是先洗后切再烧煮,这样营养元素就不容易流失. 误区二:挤掉菜汁

  • AC米兰主席赞乐视超级手机 九路视频流罕见 AC米兰主席赞乐视超级手机 九路视频流罕见

    乐视体育引入中国的国际冠军杯现已落下帷幕,但乐视体育.乐视超级手机在国际冠军杯上刮起的风暴却仍在发酵. 日前,回到意大利的AC米兰俱乐部主席加利亚尼对乐视赠予他的礼物+乐视超级手机Max赞不绝口,认为乐视超级手机LIVE桌面上的9路视频直播以及乐视体育在冠军杯上开行业先河的三路360度全景直播以及7路视频直播,将帮助体育赛事进入一个新的时代.超级手机Max展现出来的品质堪比意大利奢侈品牌阿玛尼,全金属带来的温润手感让人爱不释手. 国际冠军杯上,AC米兰虽然在点球大战中遗憾落败于皇马,但这并不影响

  • 水浒传读后感900字

    水浒传读后感900字(一) <水浒传>一书记述了以宋江为首的一百零八好汉从聚义梁山泊,到受朝廷招安,再到大破辽兵,最后剿灭叛党,却遭奸人谋害的英雄故事.读完全书,印在我脑海里挥之不去的只有两个字:忠,义. 忠,即是对自己的祖国,对自己身边的亲人,朋友尽心竭力.宋江在种种威逼利诱之下,仍然对自己的祖国忠心耿耿,这就是忠;林冲的妻子在林冲被逼上梁山之后,对高俅之子的凌辱,宁死不屈,最终上吊自杀,这也是忠.在当今这个社会中,相信很多人都能做到一个"忠"字,但是,却很少有人能够做到

  • nba2k13怎么空接?空中接力操作具体方法 nba2k13怎么空接?空中接力操作具体方法

    nba2k13耍帅的时候到了,空接.扣篮都是耍帅的动作,那么空接怎么操作呢?会不会也像扣篮一样需要调呢?下面小编来给你具体的分析和讲解 nba2k13的操作总的来说还是满简单的,起码比起12来说,新手玩家还是比较容易上手的,在这篇文章当中巴士单机游戏小编将会告诉大家如何在nba2k13中进行帅气的空中接力,实际操作会比以前更加的简单,下面就是nba2k13空中接力操作的详细步骤,希望可以帮到各位童鞋. nba2k13空中接力操作详解: nba2k13的操作算的上是非常简单了,因为和12相对比起来

  • 用Dreamweaver轻松实现网站个性小图标 用Dreamweaver轻松实现网站个性小图标

    别小看一个小小的图标,它可以充分展现出网页的个性,本实例将介绍如何在自己的个人主页上放上一个小图标. 效果说明 在地址栏上出现的已经不是微软的网页文件图标了,而变成了自己的小图标,如图 33-1 所示.如果将该网页添加到收藏夹里,那么收藏夹中也会出现个性的小图标,如图 33-2 所示. 创作思想 通过放置图标文件或者直接在网页中添加代码,制作出网站中的个性小图标. 操作步骤 ( 1 )如果想在整个网站所有网页的地址栏上都显示出自己的个性小图标,只需要将图标文件命名为 favicon.ico ,然

  • window.open弹出窗口的标题栏文字怎么更改

    window.open弹出窗口的标题栏文字如何更改? 我用window.open()方法弹出一个页面,该页面的 <title> Title </title> 里我写了一个标题. 如果是自己机器上没问题,但是当我访问的网页是在服务器上时,标题栏就变成了类似: http://192.168.0.100/text.htm -Title - Internet Explorer 我想知道前面这个http://的地址能否去掉?如何去? ------解决方案-------------------

  • 今日头条炮轰艾瑞!朋友圈取代微博成公关主战场? 今日头条炮轰艾瑞!朋友圈取代微博成公关主战场?

    这可能是春节假期前最后一次公关战. 2月4日,今日头条创始人兼CEO张一鸣在其微信朋友圈指责艾瑞数据有问题,头条另一位高管则更是直接贴出艾瑞的数据表格来"炮轰".没过多久,艾瑞总经理杨伟庆也更新了朋友圈回应此事.值得一提的是,这次撕逼战并没有发生在有认证功能的微博,而是朋友圈,难道未来的公关战,朋友圈截屏将成为一项新武器? 大叔先简单回顾一下事情的经过. 今天中午,今日头条创始人兼CEO张一鸣午间发朋友圈炮轰艾瑞数据提供的报告内容失实,并禁止公司任何部门和艾瑞有任何合作. 同时,今日头

热门推荐