kotlin语法总结
方法解释
BitmapFactory public static Bitmap decodeResource(Resources res, int id)
从资源文件中生成bitmap对象
imageview.drawable as BitmapDrawable).bitmap
从imageview中获取drawable对象 并转换为BitmapDrawable 获取bitmap对象
Bitmap.createBitmap(width , height , Bitmap.Config.ARGB_8888)
创建空白的Bitmap对象 指定 宽 高 和 图片质量
Bitmap public void getPixels(@ColorInt int[] pixels, int offset, int stride, int x, int y, int width, int height)
获取图片执行范围的像素点
pixels 接收数据的数组对象
offset 偏移量
stride 每一行读取多少的像素
x y 起点坐标
width height 宽高
Bitmap public void getPixels(@ColorInt int[] pixels, int offset, int stride, int x, int y, int width, int height)
指定图片的像素范围重新赋值
马赛克
class MonSaicActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_mon_saic)
btn1.setOnClickListener {
var bitmap = BitmapFactory.decodeResource(resources , R.mipmap.bg1)
imageview.setImageBitmap(bitmap)
}
btn2.setOnClickListener {
var bitmap = BitmapMonsaic((imageview.drawable as BitmapDrawable).bitmap , 30)
imageview.setImageBitmap(bitmap)
}
}
/**
* 马赛克原理 把整个图片分割成好几个小块
* 每个小块的颜色重新计算 取整个区域内所有像素的平均值
* size 每一块的大小
*/
fun BitmapMonsaic(sourceBitmap:Bitmap , size:Int):Bitmap?{
if(sourceBitmap == null || sourceBitmap.width == 0 || sourceBitmap.height == 0 || sourceBitmap.isRecycled){
return null
}
var width = sourceBitmap.width
var height = sourceBitmap.height
var bitmap = Bitmap.createBitmap(width , height , Bitmap.Config.ARGB_8888)
var rows = width/size
var cols = height/size
var blocks = IntArray(rows * cols)
for ( i in 0..rows){
for (j in 0..cols){
var length = blocks.size
var flag = 0
if( i == rows && j != cols ){
length = (width - i * size)*size
if(length == 0){
break
}
sourceBitmap.getPixels(blocks , 0 , size , i*size , j*size , width - i*size , size)
flag =1
}else if( i != rows && j == cols){
length = (height - j * size) *size
if(length == 0){
break
}
sourceBitmap.getPixels(blocks , 0 , size , i*size , j*size , size, height - j * size)
flag = 2
}else if( i == rows && j == cols){
length = (width - i * size )*(height - j * size)
if(length == 0){
break
}
sourceBitmap.getPixels(blocks , 0 , size , i* size , j*size , width - i*size , height - j*size)
flag = 3
}else{
sourceBitmap.getPixels(blocks , 0 , size , i * size , j * size , size , size)
}
var r = 0
var g = 0
var b = 0
var a = 0
for ( k in 0 until length){
r += Color.red(blocks[k])
g += Color.green(blocks[k])
b += Color.blue(blocks[k])
a += Color.alpha(blocks[k])
}
var color = Color.argb(a/length , r/length , g/length , b/length)
for (k in 0 until length){
blocks[k] = color
}
if(flag == 1){
bitmap.setPixels(blocks , 0 , width - i*size ,i*size , j*size , width - i*size , size)
}else if(flag == 2){
bitmap.setPixels(blocks , 0 , size , i*size , j*size , size , height - j*size)
}else if(flag == 3){
bitmap.setPixels(blocks , 0 , size , i*size , j*size , width - i*size , height - j * size)
}else{
bitmap.setPixels(blocks , 0 , size , i*size , j*size , size , size)
}
}
}
return bitmap
}
}
原图 | 效果图 |
---|---|
马赛克原图.png
|
马赛克效果图.png
|
冰冻效果
class FrozenActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_frozen)
btn1.setOnClickListener {
imageview.setImageBitmap(BitmapFactory.decodeResource(resources,R.mipmap.bg3))
}
btn2.setOnClickListener {
imageview.setImageBitmap(frozenBitmap((imageview.drawable as BitmapDrawable).bitmap))
}
}
fun frozenBitmap(oldBitmap: Bitmap):Bitmap{
var myWidth = oldBitmap.width
var myHeight = oldBitmap.height
var myPixels = IntArray(myWidth * myHeight)
oldBitmap.getPixels(myPixels , 0 ,myWidth , 0 ,0 ,myWidth ,myHeight)
for ( i in 1..myHeight-2){
for (j in 1..myWidth-2){
var myPixel = myPixels[i * myWidth + j]
var r = Color.red(myPixel)
var g = Color.green(myPixel)
var b = Color.blue(myPixel)
var myColor = r-g-b
myColor = myColor *3/2
if(myColor < 0){
myColor = -myColor
}
if(myColor > 255){
myColor = 255
}
r = myColor
myColor = g-b-r
myColor = myColor *3/2
if(myColor < 0){
myColor = -myColor
}
if(myColor > 255){
myColor = 255
}
g = myColor
myColor = b-r-g
myColor = myColor *3/2
if(myColor < 0){
myColor = -myColor
}
if(myColor > 255){
myColor = 255
}
b = myColor
r = Math.min(255 ,Math.max(0,r))
g = Math.min(255 ,Math.max(0,g))
b = Math.min(255 ,Math.max(0,b))
myPixels[ i * myWidth + j] = Color.argb(255,r,g,b)
}
}
var newBitmap = Bitmap.createBitmap(myWidth , myHeight ,Bitmap.Config.RGB_565)
newBitmap.setPixels(myPixels , 0 ,myWidth , 0 , 0 ,myWidth ,myHeight)
return newBitmap
}
}
原图 | 效果图 |
---|---|
冰冻原图.png
|
冰冻效果图.png
|
怀旧效果
class NostalgiaActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_nostalgia)
btn1.setOnClickListener {
imageview.setImageBitmap(BitmapFactory.decodeResource(resources , R.mipmap.bg3))
}
btn2.setOnClickListener {
imageview.setImageBitmap(nostalgiaBitmap((imageview.drawable as BitmapDrawable).bitmap))
}
}
fun nostalgiaBitmap(oldBitmap: Bitmap): Bitmap {
var myWidth = oldBitmap.width
var myHeight = oldBitmap.height
var myPixels = IntArray(myWidth * myHeight)
oldBitmap.getPixels(myPixels , 0 ,myWidth , 0 ,0 ,myWidth ,myHeight)
var oldR = 0; var oldG = 0; var oldB = 0; var oldPixel = 0
var newR = 0; var newG = 0; var newB = 0
for ( i in 1..myHeight-2){
for (j in 1..myWidth-2){
//解析旧的像素值
oldPixel = myPixels[myWidth*i + j]
oldR = Color.red(oldPixel)
oldG = Color.green(oldPixel)
oldB = Color.blue(oldPixel)
//设置新的像素值
newR = (0.393 * oldR + 0.769 * oldG + 0.189 * oldB).toInt()
newG = (0.349 * oldR + 0.686 * oldG + 0.168 * oldB).toInt()
newB = (0.272 * oldR + 0.534 * oldG + 0.131 * oldB).toInt()
var newPixel = Color.argb(255 ,
if(newR > 255) 255 else newR ,
if(newG > 255) 255 else newG ,
if(newB > 255) 255 else newB)
myPixels[myWidth * i + j] = newPixel
}
}
var newBitmap = Bitmap.createBitmap(myWidth , myHeight , Bitmap.Config.ARGB_8888)
newBitmap.setPixels(myPixels , 0 ,myWidth , 0 , 0 ,myWidth ,myHeight)
return newBitmap
}
}
原图 | 效果图 |
---|---|
怀旧原图.png
|
怀旧效果图.png
|