|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
我觉得很重要,一般所说的不重要应该指的是:你学好一种以后再学另一种就很容易了。(因为这样大家可能有一个错觉就是语言不是很重要,只要随便学一种就可以了,其实不是这样的。flush 良多图片处置的算法从道理上讲实在十分复杂,难点常常在怎样往写算法完成它,加倍难的就是怎样往优化完成的算法。虽然说我一直以为程序员的效力比程序的效力更主要,但为了等处置一张本人拍摄的数码照片,溜进来买杯奶茶特地再买张彩票返来发明还没算好,不管怎样都是不克不及忍耐的。
马赛克算法很复杂,说白了就是把一张图片支解成多少个val*val像素的小区块(大概在边沿有零散的小块,但不影响全体算法),每一个小区块的色彩都是不异的。为了便利起见,我们无妨让这个色彩就用该地区最左上角的谁人点的色彩。固然还能够有其他办法,好比取区块两头点的色彩,或区块中随机点的色彩作代表等等。上面的表示图就是取val=2的了局。
原始图片像素
ABCDEFG
HIJKLMN
OPQRSTU
VWXYZ01
2345678
马赛克处置后:
AACCEEG
AACCEEG
OOQQSSU
OOQQSSU
2244668
道理就是那末复杂。详细完成就看大家的头脑习气了。我的设法是:
当y(以后高度)是val的整数倍时:
扫描以后行中的每点x,假如x也是val的整数倍,纪录下以后x,y的色彩值;假如x不是val的整数倍,则相沿比来一次被纪录的色彩值。
当y不是val的整数倍:
很复杂,间接复制上一行。
复杂的说就是以线带面,终极完成让人人都看不分明
上面就是源代码。写算法不是我的刚强,不外偶然勉为其难的写个能够跑跑的囫囵吞枣版仍是能够做到的,不期望能够帮到你,只但愿没有误导你。
publicstaticBitmapKiMosaic(Bitmapb,intval)
{
if(b.Equals(null))
{
returnnull;
}
intw=b.Width;
inth=b.Height;
intstdR,stdG,stdB;
stdR=0;
stdG=0;
stdB=0;
BitmapDatasrcData=b.LockBits(newRectangle(0,0,w,h),ImageLockMode.ReadWrite,PixelFormat.Format24bppRgb);
unsafe
{
byte*p=(byte*)srcData.Scan0.ToPointer();
for(inty=0;y<h;y++)
{
for(intx=0;x<w;x++)
{
if(y%val==0)
{
if(x%val==0)
{
stdR=p[2];stdG=p[1];stdB=p[0];
}
else
{
p[0]=(byte)stdB;
p[1]=(byte)stdG;
p[2]=(byte)stdR;
}
}
else
{
//复制上一行
byte*pTemp=p-srcData.Stride;
p[0]=(byte)pTemp[0];
p[1]=(byte)pTemp[1];
p[2]=(byte)pTemp[2];
}
p+=3;
}//endofx
p+=srcData.Stride-w*3;
}//endofy
b.UnlockBits(srcData);
}
returnb;
}J2EE比较成熟一点,一些比较出名的企业应用软件都是基于J2EE的。以后的发展就不好说了。不过java比较烦,学.net的话,微软把很多工具都封装好了,学起来可能容易一点。 |
|