将c盘的文件读入图片框picture1中Word文件下载.docx
《将c盘的文件读入图片框picture1中Word文件下载.docx》由会员分享,可在线阅读,更多相关《将c盘的文件读入图片框picture1中Word文件下载.docx(32页珍藏版)》请在冰豆网上搜索。
ifp<
bthengotoexitf
i=i+1
loopuntili>
l
piccmp=true
exitf:
closen1
closen2
endfunction
privatesubcommand1_click()
msgboxiff(piccmp("
c:
\a.jpg"
"
d:
),"
一样"
两样"
)
endsub
aa64201205
2010-2-1818:
43
如果两个图像文件是同样格式的,那就不要用传统的方法打开图像、加载图像什么的,因为我试验过,VB对图像的支持是很差的,图像太大或是格式太新,都没法正常加载的,所以,我觉的,如果只是判断两个图像是否一样,并且两个图像文件的格式相同的话,完全可以把两个图像文件当成一般的二进制文件打开,然后一个字节一个字节的对比……
OptionExplicit
PrivateSubCommand1_Click()
ConstCD=1024'
一次进行比较的字节数
DimiAsLong,jAsLong,kAsLong
DimAAsLong,BAsLong,CAsLong
DimSa(1ToCD)AsByte,Sb(1ToCD)AsByte
DimFaAsString,FbAsString
Fa="
e:
\c.bmp"
'
要比较的两个文件
Fb="
\d.bmp"
C=FileLen(Fa)
IfC<
FileLen(Fb)Then
MsgBox"
不一样,文件长度不同"
,"
"
ExitSub
EndIf
A=C\CD
B=CModCD
OpenFaForBinaryAccessReadAs#1
OpenFbForBinaryAccessReadAs#2
Fori=1ToA
Forj=1ToCD
DoEvents
Get#1,,Sa(j)
Get#2,,Sb(j)
IfSa(j)<
Sb(j)Then
不一样,文件内容不同"
Next
Forj=1ToB
Close#1
Close#2
EndSub
PrivateSubForm_QueryUnload(CancelAsInteger,UnloadModeAsInteger)
UnloadMe
End
EndSub
lnleny
六级
2010-2-1911:
27
PrivateFunctionpiccmp(f1AsString,f2AsString)AsBoolean
DimpAsIPictureDisp
Picture1.AutoRedraw=True
Picture1.BorderStyle=0
Me.WindowState=vbMaximized
Setp=LoadPicture(f1)
DoEvents
Me.ScaleMode=vbTwips
Picture1.Move0,0,p.Height,p.Width
Picture1.ScaleMode=vbPixels
Command1.Visible=False
Picture1.PaintPicturep,0,0
Setp=LoadPicture(f2)
Picture1.PaintPicturep,0,0,,,,,,,vbSrcInvert
DimXAsLong,YAsLong
ForX=0ToPicture1.ScaleWidth/Screen.TwipsPerPixelX-1
ForY=0ToPicture1.ScaleHeight/Screen.TwipsPerPixelY-1
IfPicture1.Point(X,Y)<
0ThenGoToer
Next
Command1.Visible=True
piccmp=True
ExitFunction
er:
piccmp=False
EndFunction
PrivateSubcommand1_click()
MsgBoxIIf(piccmp("
f:
\map0.bmp"
"
\map1.bmp"
),"
例如有图片A,和图片B.
A中比B中多了一朵花,请问怎样比较出这两张图片有这样的不同?
?
请指教........
这个问题是能过解决得,解决办法如下:
1.两张不同得图片,如何判断出不同!
按照图片得流(Stream)进行比较,一般情况下,Stream相同得文件其文件内容应该一样,特别 限定了再图片范围得时候更是如此!
〕
2.如何区分两份流是否相同!
将二者转换成流之后,没必要一个一个byte进行比较,首先根据流得Byte[]得到字符串,将两个字符串进行哈希!
哈希结果一致就说明两者为一个图片,否则不是一个图片!
就如你下载得时候看md5值一样!
3.具体Demo:
System.IO.Stream
str=file.InputStream;
//得到上传文件得Stream
//从流中读取byte[]
byte[]
filesStream=new
byte[str.Length];
str.Read(filesStream,0,filesStream.Length);
//获得字符串!
string
fileStr=System.Text.UnicodeEncoding.Default.GetString(filesStream);
md5FileStr=System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(fileStr,"
md5"
);
--------------------------------------------另一个一样得到md5值,二者进行比较就可以了!
图像比较
一种将测试图像与一组参考图像进行比较的方法,存在不止一个参考图像,所述方法包括如下步骤:
将所述测试图像分成一个或多个测试区;
对于各测试区,将所述测试区与一个或多个参考图像中的一个或多个参考区进行比较,并识别最接近地对应于所述测试区的所述参考区;
以及 根据所述测试区与它们的被对应识别的参考区的比较来生成比较值。
.net中的GDI+能非常方便的进行图象处理,但是并未直接提供进行图片比较的类或者方法,本文的目的是探讨如何进行图片比较。
首先要说明的是,进行比较的两幅图片必须具有相同的格式,并且最好是未经压缩的图片格式。
否则,不能进行完全的相同性对比,只能做近似判断,比如各种颜色分量相差5%即认为一致。
在自己动手之前先GOOGLE一番,找到了下面两篇比较典型的文章:
(1)
这篇文章使用Image.GetPixel方法获取每个像素点的Color,然后将各点组合成一个Hash值。
关键代码段:
[CLSCompliant(false)]
publicstaticuintGetBitmapHashValue(
Bitmapimage)
{
uintresult=0xFFFFFFFF;
for(intx=0;
x<
image.Width;
x++)
for(inty=0;
y<
image.Height;
y++)
result=
BitmapHasher.CRCTable[
(result^image.GetPixel(x,y).ToArgb())&
0xFF]^
(result>
8);
returnresult^0xFFFFFFFF;
}
(2)
CSDN论坛的这个帖子有很多实现图片比较的思路,比如:
(a)比较直接用memcmp,10M以内的数据不会超过1毫秒
当然你不能用GetPix,GetPix非常慢,应该直接取出内存块来比较,
图像压缩可以把前后两幅图像相减,再找个压缩算法压缩相减的结果
另外一边只要加上这个结果就是新的图像
(b)将屏幕分成固定的若干小块,对其分别编号,分块比较,每次只传送发生改变的块
(c)请参考请他VNC开源项目。
它们通常是安装钩子监视屏幕区域的变化,然后压缩传送变化的图片区。
用判断图像变化的办法效率太低,很少被使用。
(d)保存上一张图片,抓到一张新图后,在内存中按块用memcmp比较,如果发现有不同,就发送此块,然后到客户端组装起来
由于本文只讨论图片比较,所有(c)中的安装系统钩子不考虑,其他几点无非就是用GetPixel按像素比较,或者得到图片的内存块然后比较内存块是否一致。
1.使用GetPixel得到各像素,然后逐个像素进行对比:
///<
summary>
///比较两幅图片是否一致
/summary>
paramname="
bitmap1"
图片1<
/param>
bitmap2"
图片2<
returns>
如果两幅图片相同,返回0;
如果图片1小于图片2,返回小于0的值;
如果图片1大于图片2,返回大于0的值。
<
/returns>
publicstaticintBitmapCompare(Bitmapbitmap1,Bitmapbitmap2)
{
intresult=0;
//假设两幅图片相同
if(bitmap1==null||bitmap2==null)
return-1;
if(bitmap1.Width==bitmap2.Width&
&
bitmap1.Height==bitmap2.Height)
for(inti=0;
i<
bitmap1.Width;
i++)
for(intj=0;
j<
bitmap1.Height;
j++)
Colorcolor1=bitmap1.GetPixel(i,j);
Colorcolor2=bitmap2.GetPixel(i,j);
if(color1!
=color2)
result=color1.ToArgb()-color2.ToArgb();
break;
if(result!
=0)
elseif(bitmap1.Width!
=bitmap2.Width)
result=bitmap1.Width-bitmap2.Width;
elseif(bitmap1.Height!
=bitmap2.Height)
result=bitmap1.Height-bitmap2.Height;
returnresult;
}
2.得到图片数据内存块,然后比较内存块是否一致:
用Bitmap.LockBits方法可以得到BitmapData(位图数据),BitmapData.Scan0指向了位图数据部分的基地址。
BitmapData.Stride给出了图象中每行所占的字节数目,注意BitmapData.Stride并不等于BitmapData.Width,原因如下:
(1)BitmapData.Width是每行的像素数目,每个像素所占的字节数跟PixelFormat(像素格式)有关,可以是1、4、8、16、24、32、48、64等位数;
(2)系统将图片数据行在内存中进行了对齐,每行所占字节数是4的倍数,且总是大于等于Width*BitsPerPixel/8。
Marshal.Copy方法复制内存块到字节数组。
得到图片数据内存块的代码如下:
BitmapDatabmd1=bitmap1.LockBits(newRectangle(0,0,bitmap1.Width,bitmap1.Height),ImageLockMode.ReadOnly,bitmap1.PixelFormat);
//得到图片数据对象
intbytes=bmd1.Stride*bitmap1.Height;
//图片数据大小
byte[]buff1=newbyte[bytes];
//保存图片数据的字节数组
Marshal.Copy(bmd1.Scan0,buff1,0,Marshal.SizeOf(typeof(byte))*bytes);
//复制图片数据块
//在这里对图片数据块执行操作
bitmap1.UnlockBits(bmd1);
//解锁图片数据块
对内存块进行比较的方法有以下几种:
(1)CAPI函数memcmp,该函数的原型为:
intmemcmp(constvoid*buf1,constvoid*buf2,size_tcount);
PINVOKE引用方式为:
[DllImport("
msvcrt.dll"
)]
privatestaticexternIntPtrmemcmp(byte[]b1,byte[]b2,IntPtrcount);
(2)用Marshal.ReadByte方法读取内存中的字节,然后逐字节进行比较。
IntPtrstart1=bmd1.Scan0;
intsizeOfByte=Marshal.SizeOf(typeof(byte));
sizeOfByte*bmd1.Stride*bitmap1.Height;
byteb1=Marshal.ReadByte(start1,i);
//在这里对字节进行操作,也可以用Marshal.WriteByte修改字节内容
(3)自定义函数进行字节数组比较:
publicstaticintMemoryCompare2(byte[]b1,byte[]b2)
if(b1.Length!
=b2.Length)
result=b1.Length-b2.Length;
else
b1.Length;
if(b1[i]!
=b2[i])
result=(int)(b1[i]-b2[i]);
(1)
[CLSCompliant(false)]
publicstaticuintGetBitmapHashValue(
Bitmapimage)
{
x++)
y++)
result=
BitmapHasher.CRCTable[
0xFF]^
}
(2)
(a)比较直接用memcmp,10M以内的数据不会超过1毫秒
当然你不能用GetPix,GetPix非常慢,应该直接取出内存块来比较,
图像压缩可以把前后两幅图像相减,再找个压缩算法压缩相减的结果
另外一边只要加上这个结果就是新的图像
(b)将屏幕分成固定的若干小块,对其分别编号,分块比较,每次只传送发生改变的块
(d)保存上一张图片,抓到一张新图后,在内存中按块用memcmp比较,如果发现有不同,就发送此块,然后到客户端组装起来
///比较两幅图片是否一致
图片1<
图片2<
<
publicstaticintBitmapCompare(Bitmapbitmap1,Bitmapbitmap2)
{
intresult=0;
//假设两幅图片相同
if(bitmap1==null||bitmap2==null)
return-1;
if(bitmap1.Width==bitmap2.Width&
bitmap1.Height==bitmap2.Height)
for(inti=0;
i++)
for(intj=0;
j++)