编成放大图片像素的方法

上传人:cl****1 文档编号:493558602 上传时间:2024-01-23 格式:DOC 页数:13 大小:151KB
返回 下载 相关 举报
编成放大图片像素的方法_第1页
第1页 / 共13页
编成放大图片像素的方法_第2页
第2页 / 共13页
编成放大图片像素的方法_第3页
第3页 / 共13页
编成放大图片像素的方法_第4页
第4页 / 共13页
编成放大图片像素的方法_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《编成放大图片像素的方法》由会员分享,可在线阅读,更多相关《编成放大图片像素的方法(13页珍藏版)》请在金锄头文库上搜索。

1、要解决一种图像,一方面要获得该图像的像素值,而VB自身提供的PICTUE控件虽然可以打开诸多类型的图片,但是它提供的那个POINT措施读取像素实在是太慢。而使用GePie这个API的速度也快不到哪里去,由于PIT措施自身就是对于GtPix的一种包装。 在B中要迅速获取一幅在PITURE中打开的图像比较迅速的措施是使用DI措施,固然尚有DD措施,但是使用DDB措施还需要考虑不同颜色深度的图像的分别解决,在程序的实现上要相对复杂,而使用IB措施则不必,并且在解决速度上比DB措施也慢的有限。 过程一:获得一种在PICTURE控件中打开的图像的所有像素。 PublcSbDibGet(BVl ISurc

2、e ong, XBegin AsLong, Byal BegiAs Long,ByValXEnd A Long, ByalYEndA Long) Dim iBtmaps LonDim As Long i sLongDi Dim W As Long mHAs LongOnErr GoTo ErrLne Done = Fal TimGet= tmeeTime nPutWid= Xn - XBeginInuHei = Yn- YBeginW = InPutWid+ 1H = nPutHei I (Bits 8) 1 ReDim Col(I, InPutWid, InPutHei) Wth i24Bt

3、Ino.biHeader .biBitount =Bis bopresin = 0& blanes = 1 .bSize =Len(b24BtInfobmiHeader) bWith = W .iHeight = End Withia GetCurrentbjct(dSource, 7&) GetDIBisIdouce,iBitmp, 0, H,ColVal(0, 0, 0), i4Bitnfo,& Dletebjec iitmaDone =Te TieGet =imeGtTm - TietExSubrLine:Msgo 错误号: Er.Nubr& : Err.Descption ub在这个过

4、程中所用到的只是某些参数的设定和AP的调用,不波及算法。 过程二:图像输出的过程:Publc SDBPut(ByVa IdDestiation As Lon) Dim Ws Lon Dim HA Longn ErrrGoTo rLi Don = Fale imPt tmeeimeW= Ouuti =OututHe +1Wth biBIno.bHeder .biWith = W .iHeigt = H LeBytes = ((W * ts + 31) d&HFFFFFE0) 8 .iSizemag =LnBtes * nd WithStDIBtsToevice IdDesiaion, 0, 0,

5、 W, H, 0, , 0, H, ColOut(0, 0, ),bi4BitI.bmHeer, oe = rueTimePut = imGetTim - TimePutEit SubErLie: gBox Err.DescritionEnd Sub 下面解释一下在过程中到的全局变量和数据构造,以及AI的定义。 PI定义:删除一种DPivateDecae FuncinDetDC bg32 (Byal c As Lng) s og 删除一种对象PrvateDecar Fuction DetbjectL gdi32 (yV ObjectAon) As Ln选择目前对象Privae clarFuct

6、ion GetCrretjct Lb gdi3(BVl hdc sLong,ByValuObjcTyp As Long)A Ln 获取DIBPvat carFuntion GetBits Ligd3(ByVl aHC As ong, BVlBitmap As Long, ByVal Satcan As Long, ByValnNmScansAs Lon, lpBits As Ay, pIAs BitapIno, yl wUage As Long) A Long 获取系统时间Piva Dclare Functon timeGtm Li inmmdll ()As n 数据构造定义:Pivte Ty

7、pe BtMpInfoHadr文献信息头BITMAPINHDRbiSie Long iWdth As Lng ieiht As Log ines s ntegeriBtCount As nter bComreson ALong bSizageAs ong bXPelsPereter AsLng iYPelerMeteAsLnbilUsed s Long bilImpotnt A LngEnd TpePrivae Type RGBuadrgbBlu AytegbGrenAs BytegRed A Byte rgbReseved As BytedTypPrivatType BiMpInobmiad

8、e As BitMpInfoHeer iCosAs GBQEnd Tye这三个数据构造都是在DIB中不可缺少的。我们不必深究,只是按照顺序复制粘贴直接使用就是了。过程中用到的全局变量:Priva onst Bits Lon =2颜色深度,这里把所有图像都按照32位来解决Pbic Doe AsBoolen 用于标记一种过程与否结束bic Timeet sLong 用于记录输入过程解决所耗费的时间PubicTimeu As Long 用于记录输出过程解决所耗费的时间Dim ColVal() As Byte用于寄存从DIB输入的像素值Dim oOut() As Bye 用于寄存向DIB输出的像素值D

9、imInHeiAs Long用于记录输入图像的高度Dim InPtid As on 用于记录输入图像的宽度im bi2tInfoAsBtMaInf 定义BMP信息 可以看出,我在输入和输出中使用了两个不同的动态数组ColVl()和ColOt(),这样做是有道理的,由于我们不只是为了输入和输出图像,中间还要对像素进行解决。涉及图像缩放、色彩调节、锐化、柔化等等解决,使用两个不同的数组来分别寄存数据更有助于程序的实现。有些性急的朋友说不定已经把程序贴到工程里试用了,可是会发现主线不能输出图像。这是由于当你用DIBET获得的图像还在olVl() 中呢,需要把它们放到ColOut()这个数组中去,DI

10、BT这个过程才干起作用。 这里再给出一种用于数组整体移动数据的过程:Pubicub Copyta(ByVal W AsLong, BValHsLong)im Lengt A LnDmI A LgDi L AsnI=Bits 8L =I - Lgth = (W + &) ( +1) * I Dim ColOut(, W,H)opyMemry ClOt(0, , 0), olVal(0,0, ),LenthEnd sub AP定义:Prte Dcar Su oMeor ib kere2lia tlMovemory (pest AsAny, prc As Any, ByVlBte Long) 这时,

11、我们就可以来试一下效果了:把你的显示屏调到32位色。 将前面的所有PI和变量定义所有贴到一种新建的模块里新建一种窗体,加两个ICUR控件:pcrue1,pture2一种按钮comma1 在ictrue1中加载一种图片 在cmmn1中写如下代码:su comand1_click()Wit piture .ScaleMde=.BorderStl=0 DibGet .hdc,0,.scalewidth,.salehit End WitCopyData InPutHe ,InPutWidpicure.AutoRedw=Trueiut pctur2.hdictre2.refrehendsub 运营一下,

12、按钮按下,ictreu1中的图片就立即显示到了icure2中。 这时,你也许会说,弄了这样半天就贴个图?用PainPicue不是就可以了吗? 不错,如果只是要贴个图,的确不用这样麻烦,可是,我们背面要说的图像解决部分将会用到前门得到的像素值。因此,这只是一种开始,我真正要讲的东西还在背面呢。请人们继续关注。前面讲到了二次线性插值的应用。这一篇来给人们讲一下有关锐化、柔化、扩散、雕刻这几种滤镜的实现。 一、锐化 锐化的算法很简朴,就是比较相邻的几种像素,把目前像素加上和周边的像素的差就可以了。这里我给出一种示例:A C EF G HI J KLM N O P 假设有一种图片,4*4,共6个像素,分别用A-L来代表。我们先观测这个图片,只有中间的F,,K这四个像素的“邻居”是全的。 为了简便起见,我们只解决这4个像素,由于在实际的图片中由于图片的大小都诸多像素构成,因此周边的一圈像素不做解决不会影响到最后的效果。 先计算差值:lta= F - (AB+E+I+J+K) / 8(A+BE+G+J+K) /8就是F周边的像素的平均值,将这个平均值乘以一种系数再加到F上,就得到了一种新的F值:

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 活动策划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号