基于MATLAB的数字图像处理仿真平台_TuTu998的博客-程序员秘密

技术标签: matlab  python  java  计算机视觉  opencv  

基于MATLAB的数字图像处理仿真平台

一、课题实现功能

学习MATLAB GUI程序设计,利用MATLAB图像处理工具箱,设计和实现自己的Photoshop 。要求:按照软件工程方法,根据需求进行程序的功能分析和界面设计,给出设计详细说明。然后按照自己拟定的功能要求进行程序设计和调试。

整个系统要完成的基本功能大致如下:

  1. 能对图像文件(bmp、 jpg、 tiff、 gif等)进行打开、保存、另存、打印、退出等功能操作;
  2. 数字图像的统计信息功能:直方图的统计及绘制;
  3. 数字图像的增强处理功能:
  4. 直方图的均衡化
  5. 对比度展宽
  6. 动态范围调整
  7. 空间域平滑算法的各种算法(如均值滤波、中值滤波、边界保持的滤波方法等)

4、数字图像由RGB转换成HIS空间并分别显示其分量图。

5、数字图像分割功能:


v2-80d76f8ab825b7f20e43468a6a194f43_b.jpg

v2-703f06f7565d58ca02b9afb1a5358478_b.jpg

v2-0e25044134a372f8e9c353132be9c05b_b.jpg



六、具体设计

  1. 文件


6.1.1、打开

为了让使用者更方便的使用,所以在设计的时候,通过对话框的形式来选择文件,选择uigetfile函数来实现,uigetfile函数显示一个打开文件对话框,该对话框自动列出当前路径下的目录和文件,由于这个GUI程序的操作对象是图像文件。

Uigetfile函数的调用格式为[name,path]=yigetfile(…), 在按下对话框中的执行按钮“打开”后,返回选择的文件名和路径,分别保存到“ name”和“path”中。如果按下取消按钮或是发生错误,则返回值是0。 根据返回值的情况,如果是0,则弹出提示错误的对话框,否则,通过imread函数读出图像数据,把图像数据赋值给全局变量handles.image。

6.1.2、保存

同样也通过对话框的形式来保存图像数据,通过uigetfile函数选择文件名和路径,用getimage(gca)取出坐标2变换后的图像数据保存到变量i,最后用imwrite函数,把数据i存到指定的文件。

6.1.4、退出

退出比较简单,程序如下所示:

clc;

close all;

close(gcf);

6.1.3、打印

打印功能没能实现,将它设置为不可使用,可用如下代码实现

set(handles.print, 'Enable','off' ); %放在open_callback函数末尾

set(handles.print, 'Enable','off' );%放在two_OpeningFcn中

  1. 直方图统计


6.2.1、R直方图

由于RGB图像是三维图像,所以图像数据是一个三维数组,为了显示R直方图像,把三维图像降为二维,且是当最后一个参数为1时是R直方图:

x=imhist(handles.image(:,:,1)); %当然也可以选择(:,:,2) 或(:,:,3)

imshow(y);


处理前后图片效果如下:



6.2.2、G直方图

G直方图与R直方图的程序差不多只需将数值为1的R直方图变成2即可成为G直方图

x=imhist(handles.image(:,:,2));

6.2.3、B直方图

同理可得B直方图

x=imhist(handles.image(:,:,3));


RGB三种直方图统计图如下:

v2-e739532dbb01cda9c63be8f79feaff41_b.jpg

v2-cc3d007094acaad8c097b48edc1360b0_b.jpg

原图 R直方图


v2-8462be13c2d0d6dca883f0ecee19990f_b.jpg


v2-c0d9468dc965fca09f4ed227458897cd_b.jpg











G直方图 B直方图




  1. 图像增强处理


6.3.1、直方图均衡化

在balance_Callback回退函数中实现直方图均衡化

每个回退函数中都要获取图片,上面的RGB直方图也一样需获取打开的图片。打开图片的为以下程序代码:

set(handles.axes2,'HandleVisibility','ON');

axes(handles.axes2);

直方图均衡化是判断是否为灰度图。用函数isrgb了来判断,不是灰度则将其转化,否则就直接用函数:

histeq(handles.image)% handles.image是获取的图片

来直方图均衡化处理图片


图片前后效果如下:




v2-e739532dbb01cda9c63be8f79feaff41_b.jpg

v2-cdda98843af85fa8953b123fe8f0cd0f_b.jpg


6.3.2、 对比度展宽

对图像的对比度展宽刻可自己编写算法来处理,同样的,,处理结果如图:

v2-4e781b149da51cc8f9d60a03432c19f5_b.jpg


6.3.3、动态范围调整

共图像处理功能未能实现,程序中已给出处理其图像的代码,但有错误,不能找出其错位,将其正确的处理,

原因是:nw=1./(b-a).*(h-a.*ones(sx,sy));

Error:Matrix dimensions must agree

也查过资料修改该语句,有的资料说是乘除和幂方要改成点乘点除,点幂方,这个是合理,但是改正后仍然有错,是在无能为力,

代码在后面将给出,可供参考。


6.3.4、空间域平滑算法

6.3.4.1、均值滤波

经常用到的噪声有两种,高斯噪声,椒盐噪声,可以通过以下两个函数来实现:

y=imnoise(handles.img,'gaussian',p1,p2);%高斯噪声

y=imnoise(x,'salt & pepper',p1); %椒盐噪声


均值滤波中可对高斯滤波,也可以对椒盐滤波,设计过程中采用其一种图片进行处理。但两种处理的效果就不同,对高斯噪声处理的效果更加明显


均值滤波是一种采取平均灰度值的方法进行滤波,用imnoise获得噪声的图片。这个函数可获得高斯噪声,亦可获得椒盐噪声。在采用函数conv2进行均值处理,处理前后的图片比较如下:



v2-65715d4630aa705dfb09dea50ced3ad2_b.jpg

v2-e739532dbb01cda9c63be8f79feaff41_b.jpg


6.3.4.2、中值滤波

中值滤波同均值滤波的程序差不多,只是进行滤波的原理不同,则采用不同的函数进行代替,用以下函数可进行中值滤波处理:

I = imnoise(handles.image,'salt & pepper', 0.02);

imshow(I);

j=medfilt2(I);

前后图片效果如下:

v2-6c0ddad0342b814e970250c52c4ed352_b.jpg

v2-26a8d253e319d1594409d3ac64d7910d_b.jpg



6.3.4.3、边界保持滤波

原理不同,采用knn函数是处理边界保持滤波的,程序代码的形式跟前两种滤波差不多:

I = imnoise(handles.image,'salt & pepper', 0.02);

imshow(I);

j=knn2(I);


前后图片效果如下:

v2-e739532dbb01cda9c63be8f79feaff41_b.jpg

v2-a1759cf8009e0e3af816957f2ebbcbd8_b.jpg
  1. 图像分割:


图象分割是按照某些特性(如灰度级,频谱,颜色,纹理等)将图象划分成一些区域,在这些区域内其特性是相同的或者说是均匀的,两个相邻区域彼此特性则是不同的,其间存在着边缘或边界


6.4.1、均匀性度量法

当图像被分为目标物和背景两个类时,属于同一类别的像素值分布方差最小,也即具有均匀性。

给定一初始阈值Th=Th0,将图像分为C1和C2两类

v2-35d60d7e94f9941336825436ff9ca2aa_b.jpg

分别计算两类中的方差

分别计算两类在图像中的分布概率

选择最佳阈值 Th=Th*, 将图像分为C1和C2两类,满足


均匀性度量方法的处理结果:



v2-e739532dbb01cda9c63be8f79feaff41_b.jpg

v2-67a785d61c05463925988e215c2eef06_b.jpg





6.4.2、类间最大距离法.

采用最佳阈值分割后,两类之间的差异最大,且差异采用两类中心与阈值间的距离差度量


给定一初始阈值Th=Th0,将图像分为C1和C2两类

分别计算两类的灰度均值

v2-1bf87ec35deae28339c9ac426708fd1e_b.jpg

计算相对距离度量值 s

选择最佳阈值 Th=Th*, 将图像分为C1和C2两类


v2-5869ea9b706c2ac816a41ad8bee3795f_b.jpg


图片效果:


v2-e739532dbb01cda9c63be8f79feaff41_b.jpg


v2-941c171e45eef2d3a28d07ecf62fd977_b.jpg










6.4.3、局部阈值法

不均匀照射,物体背景对比明显, 不能只使用一门限

灰度级校正。

图象分成小块,选择局部门限


局部阈值法的处理前后结果:



v2-0a1d71a5bbdcb418622d7ffd942b20a5_b.jpg

v2-e739532dbb01cda9c63be8f79feaff41_b.jpg













6.5、 颜色空间转化

6..5.1、RGB转HSV

色彩空间相互转化:

其中有很多种色彩空间,这里只介绍两种转换关系:

RGB转HSV,图像处理中有专门的函数将其进行转化,即rgb2hvs函数


转化图像前后对比如下:



v2-26b584ccbc3ac878c26488321d4046a0_b.jpg













6.5.2、RGB转HIS

首先获取图像的 RGB 3个通道

R=w(:,:,1);
G=w(:,:,2);
B=w(:,:,3);

观察HSI通道图像
因系统没有rgb2hsi函数,只有rgb2hsv函数,可自己编写程序实现算法

,用一个循环处理,分别得到HIS的色度,饱和度以及强度图,代码在后面实现


图形处理效果如下:



v2-4a5b9857dbaddc41c00c59030e28ef4d_b.jpg











6.6、 其他图像处理功能

6.6.1、锐化


6.6.2、傅里叶

这两个是附加的图像处理功能,在次不做过多的说明,可向大家看看处理图像结果进行对比一下,看看效果,可在后面附上代码




v2-4ac052a010dd18c7b9ad28b997757012_b.jpg


v2-e25b11dc2b4e73586e01f706ae47c1c6_b.jpg

锐化. 四种傅里叶变


三、源码

function varargout = two(varargin)

% Begin initialization code - DO NOT EDIT

gui_Singleton = 1;

gui_State = struct('gui_Name', mfilename, ...

'gui_Singleton', gui_Singleton, ...

'gui_OpeningFcn', @two_OpeningFcn, ...

'gui_OutputFcn', @two_OutputFcn, ...

'gui_LayoutFcn', [] , ...

'gui_Callback', []);

if nargin && ischar(varargin{1})

gui_State.gui_Callback = str2func(varargin{1});

end

if nargout

[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});

else

gui_mainfcn(gui_State, varargin{:});

end

% End initialization code - DO NOT EDIT

% --- Executes just before erzhi is made visible.

function two_OpeningFcn(hObject, eventdata, handles, varargin)

% This function has no output args, see OutputFcn.

---------------------------------------------------------

%接下来是菜单的程序

---------------------------------------------------------

function file_Callback(hObject, eventdata, handles)

--------------------------------------------------------

%文件打开程序

function open_Callback(hObject, eventdata, handles)

[name,path]=uigetfile({'*.bmp'},'载入图像');

if isequal(name,0)|isequal(path,0)

errordlg('没有选中文件','出错');

return;

else

x=imread([path,name]);

axes(handles.axes1);

imshow(x);

handles.img=x;

handles.noise_img=x;

guidata(hObject,handles)

end

---------------------------------------------------

function save_Callback(hObject, eventdata, handles)

%文件保存

[filename,pathname] = uiputfile('*.bmp','图片保存为');

if isequal([filename,pathname],[0,0])

errordlg('没有保存','出错');

return;

else

file=strcat(pathname,filename);

(handles.axes2);

i=getimage(gca);

imwrite(i,file);

end

-----------------------------------------------------

function exit_Callback(hObject, eventdata, handles)

clc;

close all;

close(gcf);

---------------------------------------------------------

% 直方图

------------------------------------------------------

function zhf_Callback(hObject, eventdata, handles)

-------------------------------------------------

function red_Callback(hObject, eventdata, handles)

% R直方图

data (see GUIDATA)

set(handles.axes2,'HandleVisibility','ON');


axes(handles.axes2);

x=imhist(handles.image(:,:,1));

x1=x(1:10:256);

horz=1:10:256;

bar(horz,x1);

set(handles.axes2,'xtick',0:50:255); ------------------------------------------------------

function green_Callback(hObject, eventdata, handles)

% G直方图

set(handles.axes2,'HandleVisibility','ON');

axes(handles.axes2);

x=imhist(handles.image(:,:,2));

x1=x(1:10:256);

horz=1:10:256;

bar(horz,x1);

set(handles.axes2,'xtick',0:50:255);

------------------------------------------------------

function blue_Callback(hObject, eventdata, handles)

% B直方图

set(handles.axes2,'HandleVisibility','ON');

axes(handles.axes2);

%if isrgb(handles.img)

x=imhist(handles.image(:,:,3));

x1=x(1:10:256);

horz=1:10:256;

bar(horz,x1);

set(handles.axes2,'xtick',0:50:255);

-----------------------------------------------------

%图像增强处理

---------------------------------------------------------

function zhf_Callback(hObject, eventdata, handles)

-------------------------------------------------

function balance_Callback(hObject, eventdata, handles)

%直方图均衡化

set(handles.axes2,'HandleVisibility','ON');

axes(handles.axes2);

if isrgb(handles.image)

a=histeq(handles.image(:,:,1));

b=histeq(handles.image(:,:,2));

c=histeq(handles.image(:,:,3));

k(:,:,1)=a;

k(:,:,2)=b;

k(:,:,3)=c;

imshow(k);

else

h=histeq(handles.image);

imshow(h);

end

function zq_Callback(hObject, eventdata, handles)

-----------------------------------------------------------------

function duibidu_Callback(hObject, eventdata, handles)

%对比度展宽

set(handles.axes2,'HandleVisibility','ON');

axes(handles.axes2);

h=im2double(handles.image);

[sx,sy]=size(h);

nw=h.^0.3;

subplot(2,2,1);

imshow(h);

title('original');

subplot(2,2,2);

imshow(nw);

title('r=0.4');

subplot(2,2,3);

imshow(h.^0.5);

title('r=0.7');

subplot(2,2,4);

imshow(h.^2);

title('r=3');


--------------------------------------------------------------------

function dongtai_Callback(hObject, eventdata, handles)

%动态调整范围

set(handles.axes2,'HandleVisibility','ON');

axes(handles.axes2);

h=im2double(handles.image);

a=0.01;

b=0.35;

[sx,sy]=size(h);

[w,n]=find(h(:)<=a);

h(n)=0;

[w1,n1]=find(h(:)>b);

h(n1)=1;

nw=1./(b-a).*(h-a.*ones(sx,sy));

subplot(1,2,1);

imshow(h);

subplot(1,2,2);

imshow(nw);

-----------------------------------------------------------------

%空间域平滑算法

function pinghua_Callback(hObject, eventdata, handles)

-----------------------------------------------------------------


function junzhi_Callback(hObject, eventdata, handles)

%均值滤波

h=[1 1 1;1 1 1;1 1 1];

h=h/9;

set(handles.axes2,'HandleVisibility','ON');

axes(handles.axes2);

x=imnoise(handles.image,'gaussian',0,0.02);

imshow(x);

j=conv2(x,h);

figure,imshow(j,[]);


--------------------------------------------------------------------

function zhongzhi_Callback(hObject, eventdata, handles)

%中值滤波

set(handles.axes2,'HandleVisibility','ON');

axes(handles.axes2);

% I=imnoise(I,'gaussian',0,0.02);

I = imnoise(handles.image,'salt & pepper', 0.02);%

j=medfilt2(I);

figure,imshow(j,[]);

--------------------------------------------------------------------

function bianjie_Callback(hObject, eventdata, handles)

% 边界保持滤波

set(handles.axes2,'HandleVisibility','ON');

axes(handles.axes2);

% I=imnoise(I,'gaussian',0,0.02);

I = imnoise(handles.image,'salt & pepper', 0.02);

imshow(I);

j=knn2(I);

figure,imshow(j,[]);

-----------------------------------------------------------------


--------------------------------------------------------------------

function junyunxing_Callback(hObject, eventdata, handles)

%均与性度量法

set(handles.axes2,'HandleVisibility','ON');

axes(handles.axes2);

v=double(handles.image);

[sx,sy]=size(v);

num=sx*sy;

t=[];

for th=6:254

[r1,c1]=find(v(:)>=th);

[r2,c2]=find(v(:)<th);

if(length(r1)~=0 & length(c1)~=0 )

L1=v(r1);

else

L1=[];

end

if(length(r2)~=0 & length(c2)~=0 )

L2=v(r2);

else

L2=[];

end

m1=mean(L1(:)); m2=mean(L2(:));

Var1=sum((L1(:)-m1).^2);Var2=sum((L2(:)-m2).^2);

Var1=var(L1(:));Var2=var(L2(:));

P1=length(L1(:))/num;

P2=length(L2(:))/num;

t=[t,P1*Var1+P2*Var2];

end

[c,l]=min(t);

B=v;

[r1,c1]=find(v(:)>=l+5);

[r2,c2]=find(v(:)<l+5);

B(r1)=255; B(r2)=0;


imshow(uint8(B));

% --------------------------------------------------------------------

function jubuyuzhi_Callback(hObject, eventdata, handles)

%局部阈值法

set(handles.axes2,'HandleVisibility','ON');

axes(handles.axes2);

v=rgb2gray(handles.image);

imshow(v); R=zeros(size(v));

H = FSPECIAL('gaussian',9,2.4);

v = imfilter(v,H);

t=graythresh(v); t=t*255;

[c,l]=find( v(:)>t);

R(c)=1;


[x,y]=size(R); q=R;

for i=10:x-10

for j=10:y-10

if R(i,j)==0

t=[R(i-1,j-1),R(i-1,j),R(i-1,j+1),R(i,j-1),R(i,j+1),R(i+1,j-1),R(i+1,j),R(i+1,j+1)];

if sum(t)==0

q(i,j)=1;

end

end

end

end

figure, imshow(q,[]);


--------------------------------------------------------------------

function leijianzuidajuli_Callback(hObject, eventdata, handles)

%类间最大法

set(handles.axes2,'HandleVisibility','ON');

axes(handles.axes2);

X=rgb2gray(handles.image);

[r,c]=size(X);

figure (1)

subplot(1,2,1)

imshow(X)

R=zeros(1,256);

for i=50:150

Xi0=X0<=i;

N0=sum(sum(Xi0));

Xm0=X0(Xi0);

u0=sum(Xm0)/N0;

Xi1=X0>i;

N1=sum(sum(Xi1));

Xm1=X0(Xi1);

u1=sum(Xm1)/N1;

R(i+1)=(u1-i)*(i-u0)/((u1-u0)^2);

end

Th=find(R==max(R(51:151)))-1


X2=zeros(r,c);

for i=1:r

for j=1:c

X2(i,j)=X0(i,j)>Th;

end

end


subplot(2,2,2)

imshow(X2)


-----------------------------------------------------------------

%颜色空间转化

--------------------------------------------------------------------

function hsv_Callback(hObject, eventdata, handles)

%RGB转HSV

set(handles.axes2,'HandleVisibility','ON');

axes(handles.axes2);

hv=rgb2hsv(handles.image);

subplot(2,2,1);

imshow(hv);

title('RGBHSV');

%RGB=reshape(ones(64,1)*reshape(jet(64),1,192),[64,64,3]);

H=hv(:,:,1);

S=hv(:,:,2);

V=hv(:,:,3);

subplot(2,2,2);

imshow(H) ;

title('§§');

subplot(2,2,3);

imshow(S);

title('§§');

subplot(2,2,4);

imshow(V);

title('§§');

--------------------------------------------------------------------

function HIS_Callback(hObject, eventdata, handles)

%RGB转HSI

set(handles.axes2,'HandleVisibility','ON');

axes(handles.axes2);

W=im2double(handles.image);%获得double型的图形矩阵

[m,n,q]=size(W);

R=W(:,:,1);

G=W(:,:,2);

B=W(:,:,3);

% 改变通道来观察图像

H=zeros(m,n);

S=H;

for i1=1:m

for i2=1:n

numerator=0.5*(R(i1,i2)-G(i1,i2)+R(i1,i2)-B(i1,i2));

denominator=sqrt((R(i1,i2)-G(i1,i2))^2+(R(i1,i2)-B(i1,i2))*(G(i1,i2)-B(i1,i2)));

theta=acos(numerator/denominator)*180/pi;

if(B(i1,i2)<=G(i1,i2))

H(i1,i2)=theta;

else

H(i1,i2)=360-theta;

end

min1=min(R(i1,i2),G(i1,i2));

min1=min(B(i1,i2),min1);

S(i1,i2)=1-3/(R(i1,i2)+G(i1,i2)+B(i1,i2))*min1;

end

end

I=(R+G+B)/3;

figure,subplot(1,3,1),imshow(H,[]),title('色度图H');

set(gcf,'outerposition',get(0,'screensize'));

set(gcf,'NumberTitle','off','Name','HSI通道图像');

subplot(1,2,2),imshow(S),title('饱和度图S');

subplot(1,2,3),imshow(I),title('强度图I');


% -----------------------------------------------------------------

%其他图像处理

---------------------------------------------------------------------------

function fly_Callback(hObject, eventdata, handles)

%傅里叶变化

set(handles.axes2,'HandleVisibility','ON');

axes(handles.axes2);

[m,n]=size(handles.image);

d=zeros(m,n);

d(60:100,60:100)=1;

w=fft2(d);

w1=fftshift(w);

[sx,sy]=size(d);

subplot(2,2,1); imshow(d);

subplot(2,2,2); imshow(abs(w1));


for i=1:sx

t= fft(d(i,:));

len=length(t)/2;

F1(i,:)=[(t(len+1:end)),t(1:len)];

end

for i=1:sy

F2=fft(F1(:,i));

len=length(F2)/2;

F(:,i)=[(F2(len+1:end));F2(1:len)];

end

subplot(2,2,3);

imshow(abs(F1));

subplot(2,2,4);

imshow((abs(F)));




function ruihua_Callback(hObject, eventdata, handles)

%锐化

k=2;

h1=[-1 0 1;-k 0 k;-1 0 1];

h2=[1 k 1;0 0 0;-1 -k -1];

set(handles.axes2,'HandleVisibility','ON');

axes(handles.axes2);

I=rgb2gray(handles.image);

subplot(121);imshow(I);

J1(:,:)=conv2(I(:,:),h1);

J2(:,:)=conv2(I(:,:),h2);

J=abs(J1)+abs(J2);

subplot(122);

imshow((J),[0 255]);

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/tutu998/article/details/120176968

智能推荐

[异常] Java文件上传异常org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of mul_吥_悔的博客-程序员秘密

前言:             开发异常千变万化,总有那么一些看似困难,实则简单的异常,也是容易被忽视的小问题!往往不经意间就会使系统报错,导致无法正常运行!错误日志:FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. C:\Tomcat6.0\temp\

中国大学生计算机设计大赛云南,第五届中国大学生计算机设计大赛(云南赛区)决赛落幕..._weixin_39620535的博客-程序员秘密

http://www.yunnan.cn 发布时间 2012-08-04 15:16:47 星期六 来源:云南网 大中小昆工获一等奖云南网讯 (记者 自建丽)8月4日,2012年(第五届)中国大学生计算机设计大赛(云南赛区)决赛在云南师范大学落下帷幕。我省昆明理工大学提交作品《西双版纳傣族地区希望小学建设模式探究》获得此次比赛一等奖。据介绍,2012年(第五届)中国大学生计算机设计大赛首次在云南省...

解决connect to host localhost port 22: Connection refused问题_a874909657的博客-程序员秘密

[email protected]:/# service ssh [email protected]:/# sudo net start sshdsudo: net:找不到命令[email protected]:/# sudo ufw disable防火墙在系统启动时自动禁用[email protected]:/# ssh localhostWelcome to Ubun

vi常用命令_aoxiaojian的博客-程序员秘密

用了vi两年,因为不用vi写代码作开发,只是简单的修改配置文件而已,因此,呵呵,两年了还是一点不熟悉。最近因为公司要求需要学习在linux/unix上开发c/c++,只好努力学一下vi/vim了。找了一本书,O'Reilly的Learning The VI Editor,chm的电子版本,认真地学了一遍,总结了一下常用命令:文件操作vi +n file 打开文件并移动到第n行vi +  fi...

随便推点

H5 手机 App 开发入门:技术篇_c#开发移动端网页_斜杠老A的博客-程序员秘密

新人学习手机 App 开发,一开始总要选择一条学习路径。如果你熟悉 Java 语言,可以学习安卓开发;如果熟悉脚本语言(比如 Python 或 Ruby),可以学习 Swift 语言,进行 iOS 开发;如果像我一样,比较熟悉 Web 网页技术,那么 H5 开发是最容易上手的。这个系列教程的第一篇,已经介绍过了手机 App 的种类。所谓的 H5 页面,其实就是混合 App 的前端,外面...

行内元素和块级元素的区别_weixin_34297704的博客-程序员秘密

一、行内元素和块级元素的区别  1、 行内元素不会占据整行,在一条直线上排列,都是同一行,水平方向排列;    块级元素会占据一行,垂直方向排列。  2、 块级元素可以包含行内元素和块级元素;行内元素不能包含块级元素。  3、 行内元素与块级元素属性的不同,主要是盒模型属性上,行内元素设置width无效,height无效(可以设置line-height),margin上下无效,pa...

vs中QT项目的路径配置_vs设置qt的dii文件路径在哪_echo77_yan的博客-程序员秘密

1.新建一个QT项目,然后选中项目名称,之后点击菜单栏的 项目-属性。2.然后点击VC++目录-包含目录,再.点击右边的下三角按钮,接着点击 “编辑”。3.设置包含目录。点击上面最左边的“新建一行”的图标,接着点击 右边的“浏览”按钮将QT的包含目录添加进来。再点击确定。4.同样的方法添加库目录。5.最后可以看到包含目录和库目录都已经设置

Apache POI Excel、WORD、PowerPoint、Visio处理_poi viso_ZhaoYingChao88的博客-程序员秘密

一 :简介开发中经常会设计到excel的处理,如导出Excel,导入Excel到数据库中,操作Excel目前有两个框架,一个是apache 的poi, 另一个是 Java Excel Apache POI 简介是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office(Excel、WORD、PowerPoint、...

Windows 脚本宿主运行的几种方式_alei8583的博客-程序员秘密

说说 Windows 脚本宿主运行的几种方式  1.在命令提示符下运行脚本 使用 Windows 脚本宿主,可以在命令提示符下运行脚本。CScript.exe 提供了用于设置脚本属性的命令行开关。 使用 CScript.exe 运行脚本  用下列语法在命令提示符下键入命令: cscript [host options...][script name] [script opti

2011级-csdn-java-张侃—struts2文件上传错误信息国际化的处理(案例)_zktalk的博客-程序员秘密

index.jsp<% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";%>

推荐文章

热门文章

相关标签