2016-10-15 12:41:23 attilax 阅读数 292

Atitit.java图片图像处理attilax总结

 

 

BufferedImage extends java.awt.Image

获取图像像素点

image.getRGB(i, lineIndex);

 

图片剪辑

/AtiPlatf_cms/src/com/attilax/img/imgx.java

cutImage

图片处理

titit 判断判断一张图片是否包含另一张小图片

 atitit 图片去噪算法的原理与实践 attilax 总结.docx

Atitit. 图像处理jpg图片的压缩 清理垃圾图片 java版本

Atitit.遍历图像像素点rgb java attilax总结

 Atitit 图像处理,字体与图片的转换.docx

atitit.验证码识别step3----去除边框---- 图像处理类库 attilax总结java版本2

 

atitit.图片相似度与图片查找的设计 获取图片指纹

 

Atitit.获取验证码图片通过web

 

atitit.GUI图片非规则按钮跟动态图片切换的实现模式总结java .net c# c++ web html js

Will  pic cut and join

 

参考

Atitit.跨语言图片处理api java c#.net php python 兼容性提升草案.docx

Atitit.验证码图片的欲处理.docx

Atitit.图片与签字合成demo说明  .docx

Atitit.java图片图像处理attilax总结.docx

 

作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 

汉字名:艾提拉(艾龙)   EMAIL:1466519819@qq.com

转载请注明来源: http://blog.csdn.net/attilax

Atiend

 

2017-03-17 14:32:18 zhangyibo123456789 阅读数 887

图像处理之对BMP图片的认识



  学了图像处理有一段时间了,有没有发现用的图片都是BMP格式的呢?

       那么我们又为什么总用BMP格式的图片呢?

       今天我也是怀着一颗好奇心把有关图片格式知识整理了一下。

       希望网友们能对图片有新的认识。


首先是图片格式大全:

BMP格式:Windows系统下的标准位图格式,未经过压缩,一般图像文件会比较大。在很多软件中被广泛应用. 
JPEG格式:也是应用最广泛的图片格式之一,它采用一种特殊的有损压缩算法,将不易被人眼察觉的图像颜色删除,从而达到较大的压缩比(可达到2:1甚至40:1),因为JPEG格式的文件尺寸较小,下载速度快,所以是互联网上最广泛使用的格式!
GIF格式:最大的特点是不仅可以是一张静止的图片,也可以是动画,并且支持透明背景图像,适用于多种操作系统,“体型”很小,网上很多小动画都是GIF格式。但是其色域不太广,只支持256种颜色.
PSD格式:Photoshop的专用图像格式,可以保存图片的完整信息,土层,通道,文字都可以被保存,图像文件一般较大。
PNG格式:与JPG格式类似,网页中有很多图片都是这种格式,压缩比高于GIF,支持图像透明,可以利用Alpha通道调节图像的透明度,是网页三剑客之一Fireworks的源文件。
TIFF格式:它的特点是图像格式复杂、存贮信息多,在Mac中广泛使用的图像格式,正因为它存储的图像细微层次的信息非常多,图像的质量也得以提高,故而非常有利于原稿的复制。很多地方将TIFF格式用于印刷.
TGA格式:TGA的结构比较简单,属于一种图形、图像数据的通用格式,在多媒体领域有着很大影响,在做影视编辑时经常使用,例如3DS MAX输出TGA图片序列导入到AE里面进行后期编辑。
EPS格式:苹果Mac机的用户则用得较多。它是用PostScript语言描述的一种ASCII码文件格式,主要用于排版、打印等输出工作。
          想必各位对此心中已经有了大概了吧。下面当然是对BMP详细解析了。静下心来,慢慢看吧。

BMP文件格式

BMP(Bitmap-File)图形文件,又叫位图文件,是Windows采用的图形文件格式,在Windows环境下运行的所有图象处理软件都支持BMP图象文件格式。Windows系统内部各图像绘制操作都是以BMP为基础的。一个BMP文件由四部分组成:

一个BMP文件,可以用代码表示,如下:

typedef struct tagBITMAP_FILE{
 
      BITMAPFILEHEADER bitmapheader;
      BITMAPINFOHEADER bitmapinfoheader;
      PALETTEENTRY palette[256];
      UCHAR *buffer;   //UCHAR 大小1字节(同BYTE), 在VC6下
 
} BITMAP_FILE;
1、 BMP文件头:BITMAPFILEHEADER
typedef struct tagBITMAPFILEHEADER { // bmfh 
    WORD    bfType; 
    DWORD   bfSize; 
    WORD    bfReserved1; 
    WORD    bfReserved2; 
    DWORD   bfOffBits; 
} BITMAPFILEHEADER;

bfType 说明文件的类型,该值必需是0x4D42,也就是字符'BM',否则表示根本不是BMP
bfSize 说明该位图文件的大小,用字节为单位
bfReserved1 保留,必须设置为0
bfReserved2 保留,必须设置为0
bfOffBits 说明从文件头开始到实际的图象数据之间的字节的偏移量。这个参数是非常有用的,因为位图信息头和调色板的长度会根据不同情况而变化,所以你可以用这个偏移值迅速的从文件中读取到位数据。

 

2、位图信息段:BITMAPINFOHEADER

typedef struct tagBITMAPINFOHEADER{ // bmih 
    DWORD  biSize; 
    LONG   biWidth; 
    LONG   biHeight; 
    WORD   biPlanes; 
    WORD   biBitCount 
    DWORD  biCompression; 
    DWORD  biSizeImage; 
    LONG   biXPelsPerMeter; 
    LONG   biYPelsPerMeter; 
    DWORD  biClrUsed; 
    DWORD  biClrImportant; 
} BITMAPINFOHEADER; 

biSize 说明BITMAPINFOHEADER结构所需要的字节数
biWidth 说明图象的宽度,以象素为单位
biHeight 说明图象的高度,以象素为单位。注:这个值除了用于描述图像的高度之外,它还有另一个用处,就是指明该图像是倒向的位图,还是正向的位图。如果该值是一个正数,说明图像是倒向的,即:数据的第一行其实是图像的最后一行,如果该值是一个负数,则说明图像是正向的。大多数的BMP文件都是倒向的位图,也就是时,高度值是一个正数。
biPlanes 表示bmp图片的平面属,显然显示器只有一个平面,所以恒等于1
biBitCount 说明比特数/象素,其值为1、4、8、16、24、或32。
biCompression 说明图象数据压缩的类型,其中: 

BI_RGB:没有压缩

BI_RLE8:每个象素8比特的RLE压缩编码,压缩格式由2字节组成(重复象素计数和颜色索引);

BI_RLE4:每个象素4比特的RLE压缩编码,压缩格式由2字节组成

BI_BITFIELDS:每个象素的比特由指定的掩码决定。

BI_JPEG:JPEG格式

biSizeImage 说明图象的大小,以字节为单位。当用BI_RGB格式时,可设置为0。
biXPelsPerMeter 说明水平分辨率,用象素/米表示。
biYPelsPerMeter 说明垂直分辨率,用象素/米表示。
biClrUsed 说明位图实际使用的彩色表中的颜色索引数(设为0的话,则说明使用所有调色板项)。
biClrImportant 说明对图象显示有重要影响的颜色索引的数目,如果是0,表示都重要。

3、调色板

上面这张BMP图片是否有调色板呢?答案是否定的。

因为从bfOffBits = 54字节可以看出,刚好是sizeof(BITMAPFILEHEADER )+sizeof(BITMAPINFOHEADER);

那么究竟调色板是什么东西?有什么用?为什么我们这种图片不带调试板呢?

我们先来说说三元色RGB概念。

我们知道,自然界中的所有颜色都可以由红、绿、蓝(R,G,B)组合而成。有的颜色含有红色成分多一些,如深红;有的含有红色成分少一些,如浅红。针对含有红色成分的多少,可以分成0到255共256个等级,0级表示不含红色成分;255级表示含有100%的红色成分。同样,绿色和蓝色也被分成256级。这种分级概念称为量化。

表1.1 常见颜色的RGB组合值


当一幅图中每个象素赋予不同的RGB值时,能呈现出五彩缤纷的颜色了,这样就形成了彩色图。

让我们举例说明什么是调色板?为什么需要调色板?

        有一个长宽各为200个象素,颜色数为16色的彩色图,每一个象素都用R、G、B三个分量表示。因为每个分量有256个级别,要用8位(bit),即一个字节(byte)来表示,所以每个象素需要用3个字节。整个图象要用200×200×3,约120k字节,可不是一个小数目呀!如果我们用下面的方法,就能省的多。

因为是一个16色图,也就是说这幅图中最多只有16种颜色,我们可以用一个表:表中的每一行记录一种颜色的R、G、B值。这样当我们表示一个象素的颜色时,只需要指出该颜色是在第几行,即该颜色在表中的索引值。举个例子,如果表的第0行为255,0,0(红色),那么当某个象素为红色时,只需要标明0即可。

让我们再来计算一下:16种状态可以用4位(bit)表示,所以一个象素要用半个字节。整个图象要用200×200×0.5,约20k字节,再加上表占用的字节为3×16=48字节.整个占用的字节数约为前面的1/6,省很多吧?

        这张R、G、B的表,就是我们常说的调色板(Palette),另一种叫法是颜色查找表LUT(Look Up Table),似乎更确切一些。调色板在windows里的结构定义如下:

typedef struct tagPALETTEENTRY { // pe 
    BYTE peRed; 
    BYTE peGreen; 
    BYTE peBlue; 
    BYTE peFlags; 
} PALETTEENTRY; 

那么为什么我们这张BMP不带调色板呢?

       是因为我们这张BMP是24位真彩色的BMP,所谓真彩色图(true color),就是它的颜色数高达256×256×256种,也就是说包含我们上述提到的R、G、B颜色表示方法中所有的颜色。真彩色图并不是说一幅图包含了所有的颜色,而是说它具有显示所有颜色的能力,即最多可以包含所有的颜色。表示真彩色图时,每个象素直接用R、G、B三个分量字节表示,而不采用调色板技术。原因很明显:如果用调色板,表示一个象素也要用24位,这是因为每种颜色的索引要用24位(因为总共有256×256×256种颜色,即调色板有256×256×256行),和直接用R,G,B三个分量表示用的字节数一样,不但没有任何便宜,还要加上一个256×256×256×3个字节的大调色板。所以真彩色图直接用R、G、B三个分量表示,它又叫做24位色图。

这么看来BMP文件不能一概而论了,其是否用调色板或者是RGB掩码,位图数据中的数据的真正含义直接与biBitCount 有关,不同类型的位图,其中的设计原理也不同,下面对此作一个对比:


4、位图数据

上面基本把调色板及相关取色策略梳理清楚了,看下面的例子24位BMP图,每3个字节表示一个像素,3个字节分别表示R、G、B的分量值


这里每3个字节表示一个像素的颜色,注意:由于位图信息头中的图像高度是正数,所以位图数据在文件中的排列顺序是从左下角到右上角,以行为主序排列的。

这是我见过最详细的资料了,整理了一下分享给大家。

参考资料:

http://www.cnblogs.com/xiekeli/archive/2012/05/09/2491191.html

2016-10-15 12:40:00 weixin_30273763 阅读数 0

 

Atitit.java图片图像处理attilax总结

 

 

BufferedImage extends java.awt.Image

获取图像像素点

image.getRGB(i, lineIndex);

 

图片剪辑

/AtiPlatf_cms/src/com/attilax/img/imgx.java

cutImage

图片处理

titit 判断判断一张图片是否包含另一张小图片

 atitit 图片去噪算法的原理与实践 attilax 总结.docx

Atitit. 图像处理jpg图片的压缩 清理垃圾图片 java版本

Atitit.遍历图像像素点rgb java attilax总结

 Atitit 图像处理,字体与图片的转换.docx

atitit.验证码识别step3----去除边框---- 图像处理类库 attilax总结java版本2

 

atitit.图片相似度与图片查找的设计 获取图片指纹

 

Atitit.获取验证码图片通过web

 

atitit.GUI图片非规则按钮跟动态图片切换的实现模式总结java .net c# c++ web html js

Will  pic cut and join

 

参考

Atitit.跨语言图片处理api java c#.net php python 兼容性提升草案.docx

Atitit.验证码图片的欲处理.docx

Atitit.图片与签字合成demo说明  .docx

Atitit.java图片图像处理attilax总结.docx

 

作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 

汉字名:艾提拉(艾龙)   EMAIL:1466519819@qq.com

转载请注明来源: http://www.cnblogs.com/attilax/

Atiend

 

 

转载于:https://www.cnblogs.com/attilax/p/5963159.html

2018-04-22 13:07:40 z_c_z_ 阅读数 166
图像处理
图像的格式
jpeg/jpg
png
是一种网络图像,采用 了无损压缩标准
gif
动态图片
图像处理能做什么
画图
验证码
改图
图像的缩放(防止图片过大浪费资源),添加水印(防止盗图)
GD库
GD库本身是一个扩展,需要检查是否开启
查看PHP扩展文件C:\xampp\php\ext是否有php_gd2.dll
查看php.ini中是否开启了php_gd2.dll也可以通过phpinfo查看
画图
步骤
1、创建背景图像
imagecreatetruecolor(宽度,高度)
imagecolorallocate(资源,红,绿,蓝)
imagefill()填充画布
注意:imagefill是区域填充,只会填充x和y坐标相邻的颜色并且相同的颜色,不相邻就算颜色相同也不会填充
2、在背景上绘图或者输入文本
imagsetpixel()画点
imageline()画线
imagerectangle()矩形
imageellipse()椭圆
imagettftext(资源,字号,角度,x,y,颜色,字体,写的内容)   
x,y表示的是第一个字符的左下角 坐标
要包含字体文件
如果你要写中文需要找一个支持中文的字体
imagettfbbox()取得文本的范围
imagettfbbox()返回一个含有8个单元数组表示的文本外框的四个角
                 0 左下角 X 位置 
                1 左下角 Y 位置 
                2 右下角 X 位置 
                3 右下角 Y 位置 
                4 右上角 X 位置 
                5 右上角 Y 位置 
                6 左上角 X 位置 
                7 左上角 Y 位置 
如何取得自定义字体的宽度和高度
abs($array[0]-$array[2]);  字体的宽度
abs($array[7]-$array[1]);  字体的高度 
3、输出或保存图像
imagejpeg()
imagepng()
imagegif()
如果没有写文件名只是写了一个必选参数(资源)那么代表输出到浏览器
4、关闭资源
imagedestroy()
其他
imagecreateformjpeg()
imagecreatefrompng()
imagecreatefromgif()
以文件创建一个画布
图像缩放
imagecopyresampled(目标图像,源图像,目标x轴 0,目标y轴 0,源x 0,源y 0,目标宽度,目标高度,源宽,源高)
getimagesize(文件名) 返回一个包函图像信息的数组
    0=>宽度
    1=>高度
    2=>文件的类型
        1->gif
        2->jpeg
        3->png
等比例缩放公式
if(新宽 && 旧宽 < 旧高){
            新宽 = (新高/旧高)*旧宽
        }else{
            新高 = (新宽/旧宽)*旧高
        }
1、根据这个公式 一般情况下,只有宽度和高度等于里面的一个值,其他的值均小于原来的值
2、如果不需要黑边,那么将画布也设置为这个新的宽度和新的高度就行了(缩放之后的新宽度、新高度)
图像加水印
bool          imagecopy ( 目标图像, 水印图像 , 目标x , 目标y , 水印x , 水印y , 水印宽 , 水印高 )   目标x,y  表示水印图片放置在目标图像的x和y坐标。水印的x和水印y表示从水印图片截取起始点的坐标
注意
在输出图片的时候,一定要注意你的编辑器的格式为utf-8无bom的格式。
图像的格式
jpeg/jpg
png
是一种网络图像,采用 了无损压缩标准
gif
动态图片
图像处理能做什么
画图
验证码
改图
图像的缩放(防止图片过大浪费资源),添加水印(防止盗图)
GD库
GD库本身是一个扩展,需要检查是否开启
查看PHP扩展文件C:\xampp\php\ext是否有php_gd2.dll
查看php.ini中是否开启了php_gd2.dll也可以通过phpinfo查看
画图
步骤
1、创建背景图像
imagecreatetruecolor(宽度,高度)
imagecolorallocate(资源,红,绿,蓝)
imagefill()填充画布
注意:imagefill是区域填充,只会填充x和y坐标相邻的颜色并且相同的颜色,不相邻就算颜色相同也不会填充
2、在背景上绘图或者输入文本
imagsetpixel()画点
imageline()画线
imagerectangle()矩形
imageellipse()椭圆
imagettftext(资源,字号,角度,x,y,颜色,字体,写的内容)   
x,y表示的是第一个字符的左下角 坐标
要包含字体文件
如果你要写中文需要找一个支持中文的字体
imagettfbbox()取得文本的范围
imagettfbbox()返回一个含有8个单元数组表示的文本外框的四个角
                 0 左下角 X 位置 
                1 左下角 Y 位置 
                2 右下角 X 位置 
                3 右下角 Y 位置 
                4 右上角 X 位置 
                5 右上角 Y 位置 
                6 左上角 X 位置 
                7 左上角 Y 位置 
如何取得自定义字体的宽度和高度
abs($array[0]-$array[2]);  字体的宽度
abs($array[7]-$array[1]);  字体的高度 
3、输出或保存图像
imagejpeg()
imagepng()
imagegif()
如果没有写文件名只是写了一个必选参数(资源)那么代表输出到浏览器
4、关闭资源
imagedestroy()
其他
imagecreateformjpeg()
imagecreatefrompng()
imagecreatefromgif()
以文件创建一个画布
图像缩放
imagecopyresampled(目标图像,源图像,目标x轴 0,目标y轴 0,源x 0,源y 0,目标宽度,目标高度,源宽,源高)
getimagesize(文件名) 返回一个包函图像信息的数组
    0=>宽度
    1=>高度
    2=>文件的类型
        1->gif
        2->jpeg
        3->png
等比例缩放公式
if(新宽 && 旧宽 < 旧高){
            新宽 = (新高/旧高)*旧宽
        }else{
            新高 = (新宽/旧宽)*旧高
        }
1、根据这个公式 一般情况下,只有宽度和高度等于里面的一个值,其他的值均小于原来的值
2、如果不需要黑边,那么将画布也设置为这个新的宽度和新的高度就行了(缩放之后的新宽度、新高度)
图像加水印
bool          imagecopy ( 目标图像, 水印图像 , 目标x , 目标y , 水印x , 水印y , 水印宽 , 水印高 )   目标x,y  表示水印图片放置在目标图像的x和y坐标。水印的x和水印y表示从水印图片截取起始点的坐标
注意
在输出图片的时候,一定要注意你的编辑器的格式为utf-8无bom的格式。
2018-01-30 18:44:37 ShareUs 阅读数 460

  1972年11月的《花花公子》杂志的封面人物名叫Lena Soderberg模特照片,成为数字图像处理和压缩的标准格式,研究人员用它来测试自己的算法,还常被用作数字视频处理各种实验及科学出版物的例图。
  规避图片OOM或省流量及快速上传给后台。图片类社交App可选Fresco框架。

-- Android 图片压缩框架- https://github.com/Shouheng88/Compressor
Android 端的相机优化和 JNI 操作 OpenCV 进行图片处理
Luban 和 Compressor 

-- ImageView.ScaleType
Android ImageView的scaleType属性与adjustViewBounds属性- http://www.2cto.com/kf/201411/348601.html
[Android] ImageView.ScaleType设置图解- http://blog.csdn.net/larryl2003/article/details/6919513
自定义ImageView控件 | 一个可以缩放, 平移的自定义ImageView控件- http://best.factj.com/sephiroth74/ImageViewZoom

-- com.bumptech.glide.request.target.SquaringDrawable cannot be cast to android.graphics.drawable.Bitma- https://blog.csdn.net/onceing/article/details/73277016
  Glide.with(getContext()).load(R.drawable.com_ic_default_avatar_home)
                    .asBitmap().into(mPersionImage);

-- Xfermode
图像操纵大师Xfermode:自定义UI中,少不了对多种图像的叠加覆盖,而需要达到预期的目的,我们便需要今天的主角Xfermode。Xfermode 有三个孩子,分别是:AvoidXfermode ,PixelXorXfermode ,PorterDuffXfermode;而 AvoidXfermode 和 PixelXorXfermode 已经在 API 16之后被标记为removed,所以就只剩下小儿子 PorterDuffXfermode 为我们合成图像;
 https://github.com/zincPower/UI2018/blob/master/class4_xfermode/src/main/java/com/zinc/class4_xfermode/widget/GoogleXFerModeView.java
 https://github.com/zincPower/UI2018/blob/master/class4_xfermode/src/main/java/com/zinc/class4_xfermode/activity/ZincXFerModeActivity.java

> 图片压缩、处理,Gif,大图
-- 图片压缩
  在 Android 中进行图片压缩是非常常见的开发场景,主要的压缩方法有两种:其一是质量压缩,其二是下采样压缩
  如何提高 Android 的压缩率,这里需要提到两个库,一个是 mozilla/mozjpeg,另一个是 libjpeg-turbo,前者是一个来自 Mozilla 实验室的 JPEG 图像编码器项目,目标是在不降低图像质量且兼容主流的解码器的情况下,提供产品级的 JPEG 格式编码器来提高压缩率以减小 JPEG 文件的大小,后者相当于是一个 libjpeg 的增强版,前者也是基于后者,在后者的基础上进行了一些优化。
  第三方编码解码库或者硬件编解码库,例如 libpng 和 libjpeg,libgif 等.
  libjpeg是广泛使用的开源JPEG图像库(http://en.wikipedia.org/wiki/Libjpeg ),安卓也依赖libjpeg来压缩图片。通过查看源码,我们会发现安卓并不是直接封装的libjpeg,而是基于了另一个叫Skia的开源项目(http://en.wikipedia.org/wiki/Skia_Graphics_Engine)来作为的图像处理引擎。Skia是谷歌自己维护着的一个大而全的引擎,各种图像处理功能均在其中予以实现,并且广泛的应用于谷歌自己和其它公司的产品中(如:Chrome、Firefox、Android等)。Skia对libjpeg进行了良好的封装,基于这个引擎可以很方便为操作系统、浏览器等开发图像处理功能。libjpeg在压缩图像时,有一个参数叫optimize_coding。压缩工具及原理:tinypng ,pngquant

基于libjpeg-turbo自行编译了一版native的安卓库,专门用来压缩图片-https://github.com/bither
JNI实现图片压缩- https://github.com/zengfw/EffectiveBitmap
Android图片压缩- https://github.com/bither/bither-android-lib  
Android图片压缩- http://download.csdn.net/detail/loveroselove/9495382
Tiny图片压缩库- https://github.com/Sunzxyong/Tiny
bitmap的六种压缩方式,Android图片压缩- http://blog.csdn.net/harryweasley/article/details/51955467
图片压缩Compressor- https://github.com/zetbaitsu/Compressor

  针对图片尺寸的修改其实就是一个图像重新采样的过程,放大图像称为上采样(upsamping),缩小图像称为下采样(downsampling).
  在 Android 中图片重采样提供了两种方法,一种叫做邻近采样(Nearest Neighbour Resampling),另一种叫做双线性采样(Bilinear Resampling)。
  除了 Android 中这两种常用的重采样方法之外,还有另外比较常见的两种:双立方/双三次采样(Bicubic Resampling) 和 Lanczos Resampling。除此之外,还有一些其他个人或机构发明的算法 Hermite Resampling,Bell Resampling,Mitchell Resampling。

-- 图片无损压缩:ImageOptim ; 图片有损压缩:TinyPNG/ImageAlpha
TinyPNG支持对 PNG/JPEG 文件做压缩处理,效果不错- https://tinypng.com/
pngquant支持 PNG 压缩,有时候 TinyPNG 处理过的图片噪点会稍多,可以考虑用 pngquant 来处理- https://pngquant.org/
ImageOptim支持压缩 PNG/JPEG/GIF,只支持 Mac- https://imageoptim.com/mac
mozjpeg:ImageOptim online用于 PNG 转 JPEG、JPEG 压缩- https://imageoptim.com/online

-- 图像处理
图像处理技术- https://blog.csdn.net/jinshengtao/article/category/2776655
Android开发常用开源框架:图片处理- http://blog.csdn.net/axi295309066/article/details/56984137
Android图像处理整理- http://blog.csdn.net/luzhenyuxfcy/article/details/49427781
  人们普遍认为角点是二维图像亮度变化剧烈的点或图像边缘曲线上曲率极大值的点。
  角点的检测主要有两类基于图像边缘的方法和基于图像灰度的方法。前者很大程度上依赖于图像的分割和边缘提取,一旦待检测目标发生局部变化,很可能导致操作失败,因此该类方法使用范围较小;后者有很多方法,包括Harris算子,Moravec算子,Susan算子等等。

两个图像处理库:libjpeg、Skia。

  Android多点触控技术实战,自由地对图片进行缩放和移动- http://blog.csdn.net/guolin_blog/article/details/11100327
  PinchImageView(http://best.factj.com/boycy815/PinchImageView)|国人写的, 可能是体验最好的图片手势控件| 支持双击放大,双击缩小,超出边界会回弹, 滑动惯性,不同分辨率无缝切换,可与ViewPager结合使用。
  GestureViews(http://best.factj.com/alexvasilkov/GestureViews)|包含ImageView的自定义FrameLayout | 项目目的是让图片的查看尽可能流畅平滑, 让开发者更加方便地集成到自己的应用中, 支持手势控制和动画 。
  PhotoView(http://best.factj.com/chrisbanes/PhotoView)| 致力于帮助开发者高效的创建可缩放的ImageView | 重写ImageView的实现, 支持多点触摸的图片缩放      
  subsampling-scale-image-view(http://best.factj.com/davemorrissey/subsampling-scale-image-view) | 一个Android自定义图片视图, 专为图片画廊设计| 丰富的配置选项, 更方便的实现图片的手势缩放, 旋转, 平移. 无损展示大图, 完美的地嵌入画廊, 地图等.可显示大图(地图, 建筑设计图)等而不造成OutOfMemoryErrors(OOM内存溢出异常) 
  TouchImageView(http://best.factj.com/MikeOrtiz/TouchImageView) | 一个ImageView的拓展类 | 支持ImageView所有功能, 添加了平移, 缩放, 拖拽, 滑动, 双击缩放等动画.

Android图片剪裁库- https://github.com/Jhuster/ImageCropper
圆形图标制作Image Asset Studio- https://github.com/baidusoso/RoundIcon
Android图片选择框架,提供了微信和知乎主题的UI支持- https://github.com/qingmei2/RxImagePicker
Android 端强大的仿微信图片选择器- https://gitee.com/maxiaoyong/Multi_image_selector_from_Github
自定义图片九宫格控件(IKNinePhotoView)- https://github.com/Idtk/IKNinePhotoView

 - Tiny Jpeg Decoder (JPEG解码)
Tiny Jpeg Decoder是一个可以用于嵌入式系统的JPEG解码器。也可以在Windows上编译通过。在此分析一下它部分的源代码,辅助学习JPEG解码知识。通过TinyJpeg可以将JPEG(*.jpg)文件解码为YUV(*.yuv)或者RGB(*.tga)文件。

 - ImageMagik处理图片的功能很强大 vs PhotoShop。ImageMagick是一套功能强大、稳定而且开源的工具集和开发包,可以用来读、写和处理超过89种基本格式的图片文件,包括流行的TIFF、JPEG、GIF、PNG等格式。利用ImageMagick,你可以根据web应用程序的需要动态生成图片, 还可以对一个(或一组)图片进行改变大小、旋转、锐化、减色或增加特效等操作,并将操作的结果以相同格式或其它格式保存,对图片的操作,即可以通过命令行进行,也可以用C/C++、Perl、Java、PHP、Python或Ruby编程来完成。

-- # 腾讯WebP图片的探索,大致的示例代码
InputStream is = getAssets().open("weixin.webp");
Bitmap bitmap = null;
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN) {
    bitmap = WebPDecoder.getInstance().decodeWebP(streamToBytes(is));
} else {
    bitmap = BitmapFactory.decodeStream(is);
}
imageView.setImageBitmap(bitmap);
private static byte[] streamToBytes(InputStream is) {
    ByteArrayOutputStream os = new ByteArrayOutputStream(1024);
    byte[] buffer = new byte[1024];
    int len;
    try {
        while ((len = is.read(buffer)) >= 0) {
            os.write(buffer, 0, len);
        }
    } catch (java.io.IOException e) {
    }
    return os.toByteArray();
}

-- 加载巨图方案(制作长图及加载长图)
Android 高清加载巨图方案 拒绝压缩图片- http://blog.csdn.net/trent1985/article/details/49332877
很多的手势检测- https://github.com/rharter/android-gesture-detectors
显示巨图的方案- https://github.com/johnnylambada/WorldMap
Android大图片处理- http://blog.csdn.net/geofferysun/article/details/52805619

-- 制作/播放GIf  Android (Glide)
glide可以支持gif和短视频。
Android实现播放GIF动画的强大ImageView- http://www.cnblogs.com/qingchen1984/p/5056390.html
Android屏幕内容制作成GIF图方式- http://blog.csdn.net/u014686875/article/details/51124969
android app动图优化:源码giflib加载gif动图,性能秒杀glide- https://blog.csdn.net/wxk105/article/details/71698515
GIF动态图制作- http://blog.csdn.net/q4878802/article/details/49274557

> 其他Android图片压缩开源库Demo
Luban(鲁班) —— Android图片压缩工具,仿微信朋友圈压缩策略。
Android 图片压缩LuBan鲁班eclipse版项目- http://download.csdn.net/detail/pengpenggxp/9828742
图片压缩LuBan demo- http://download.csdn.net/detail/shareus/9853438
Luban - https://github.com/Curzibn/Luban
Google 官方多媒体和图形图像相关的处理:https://github.com/google/grafika

> 图片处理中的软引用、强化引用、弱引用;三级缓存策略
  在内存引用上做些处理,常用的有软引用、强化引用、弱引用(如图片处理)。
  在过去,我们经常会使用一种非常流行的内存缓存技术的实现,即软引用或弱引用 (SoftReference or WeakReference)。但是现在已经不再推荐使用这种方式了,因为从 Android 2.3 (API Level 9)开始,垃圾回收器会更倾向于回收持有软引用或弱引用的对象,这让软引用和弱引用变得不再可靠。另外,Android 3.0 (API Level 11)中,图片的数据会存储在本地的内存当中,因而无法用一种可预见的方式将其释放,这就有潜在的风险造成应用程序的内存溢出并崩溃。
  软引用(SoftReference)、虚引用(PhantomRefrence)、弱引用(WeakReference),这三个类是对heap中java对象的应用
heap中对象有强可及对象、软可及对象、弱可及对象、虚可及对象和不可到达对象。应用的强弱顺序是强、软、弱、和虚。对于对象是属于哪种可及的对象,由他的最强的引用决定。
 String abc=new String("abc");  //1、强可及对象      
 SoftReference<String> abcSoftRef=new SoftReference<String>(abc);  //2、软可及对象     
 WeakReference<String> abcWeakRef = new WeakReference<String>(abc); //3、弱可及对象 
 Object obj = new Object();
 PhantomReference<Object> pf = new PhantomReference<Object>(obj); //4、虚可及对象   abc=null;     
 abcSoftRef.clear();//5、不可到达对象  

-- 三级缓存策略,内存 硬盘策略及占用大小及限制. 图片缓存技术
  图片的三级缓存机制一般是指应用加载图片的时候,分别去访问内存,文件和网络而获取图片数据的一种行为。缓存策略,采用“内存-本地-网络”三级缓存策略:
 1.内存缓存使用的就是LruCache. 
 2.文件缓存,我们使用的是DiskLruCache
 3.网络请求,这里我们使用Volley网络请求框架。

> 开源图片处理框架,Picasso/Glide/ImagLoader/Fresco
图片加载库:ImageLoader,UIL,Volley,主流的有,Picasso,Glide,Fresco

 -- 图片处理
Picasso-transformations 一个为Picasso提供多种图片变换的库;
Glide-transformations   一个为Glide提供多种图片变换的库;
Android-gpuimage,基于OpenGL的Android过滤器;

1.Picasso是著名的开源组织Square出品的图片处理框架,使用的比较多;
2.Glide是Google的员工基于Picasso开发,优化的,Android官网推荐使用的图片处理框架;
3.Fresco是Facebook开源的图片处理框架,真正做到了三级缓存,功能强大,强烈推荐使用;
4.Android Universal Image Loader是一个老牌的图片处理框架,但是在2015年的9月份已经停止更新维护,所以不推荐使用。

  说到内存缓存的实现,非常容易就让人想到LruCache算法(Least Recently Used),也叫近期最少使用算法。它的主要算法原理就是把最近使用的对象用强引用存储在LinkedHashMap中,并且把最近最少使用的对象在缓存值达到预设定值之前从内存中移除。LruCache的用法也比较简单.
  Glide内存缓存的实现自然也是使用的LruCache算法。不过除了LruCache算法之外,Glide还结合了一种弱引用的机制,共同完成了内存缓存功能

Android图片加载框架最全解析(三),深入探究Glide的缓存机制- http://blog.csdn.net/guolin_blog/article/details/54895665
Picasso,Glide,Fresco对比分析- http://blog.csdn.net/github_33304260/article/details/70213300

Picasso框架:获取并显示远程图片,强大的图片下载和缓存的第三方库。
 Picasso的基本用法:Picasso.with(context).load(imageUrl).into(imageView);
 剪裁大小:Picasso.with(context).load(imageUrl).resize(50,50).centerCrop().into(imageView);
 占位符图片:Picasso.with(context).load(imageUrl).placeholder(R.drawable.image_placeholder).error(R.drawable.image_error_placeholder);
 载入本地资源:Picasso.with(context).load(R.drawable.icon).into(imageView);
                     Picasso.with(context).load("file:///android_asset/Adnroid.png").into(imageView);
                     Picasso.wiht(context).load(new File(...)).into(imageView);
  调试:为了方便调试,可以通过调用Picasso的setIndicatiorEnabled(true);可以让不同来源的图片显示一个不同的色彩标记.
  解决问题:
  自动将图像缓存在本地;通过图片压缩转换以减少内存消耗;自动处理了ImageView的回收,即自动取消不在视野范围内的ImageView视图资源的加载;在适配器中自动发现和重用以前取消的下载;图像格式转换:很多时候需要将图片进行格式转换或者剪裁以节省内存或者达到我们的布局效果;占位符图片:当图片未正常显示时默认的图片,通过placeholder()设置,Picasso也支持设置图片显示错误时显示的默认图片,通过error()设置;

设置图片圆角: 步骤1:
public class CircleTransform implements Transformation {
        @Override
        public Bitmap transform(Bitmap source) {
            int size = Math.min(source.getWidth(), source.getHeight());
            int x = (source.getWidth() - size) / 2;
            int y = (source.getHeight() - size) / 2;

            Bitmap squaredBitmap = Bitmap
                    .createBitmap(source, x, y, size, size);
            if (squaredBitmap != source) {
                source.recycle();
            }
            Bitmap bitmap = Bitmap.createBitmap(size, size, source.getConfig());

            Canvas canvas = new Canvas(bitmap);
            Paint paint = new Paint();
            BitmapShader shader = new BitmapShader(squaredBitmap,
                    BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP);
            paint.setShader(shader);
            paint.setAntiAlias(true);
            float r = size / 2f;
            canvas.drawCircle(r, r, r, paint);
            squaredBitmap.recycle();
            return bitmap;
        }

        @Override
        public String key() {
            return "circle";
        }
    }

步骤2: Picasso.with(this).load(R.drawable.meinv2).transform(new CircleTransform()).into(img);

 -- 1.Bugs:
com.bumptech.glide.request.target.SquaringDrawable cannot be cast to android.graphics.drawable.BitmapDrawable:
Android 关于Glide的拓展(高斯模糊、加载监听、圆角图片)- http://blog.csdn.net/onceing/article/details/73277079
 -- 2.Bugs: Picasso detected an unsupported OkHttp on the classpath- https://stackoverflow.com/questions/24125856/picasso-detected-an-unsupported-okhttp-on-the-classpath/32091981#32091981
 解决方案(增加依赖包):
compile 'com.squareup.okhttp:okhttp:2.4.0'
compile 'com.squareup.okhttp:okhttp-urlconnection:2.2.0'
compile 'com.squareup.picasso:picasso:2.4.0'
 --3.Error “You must not call setTag() on a view Glide is targeting” when use Glide - http://blog.csdn.net/ltym2014/article/details/51558695
报错原因大致是因为Glide加载的ImageView调用了setTag()方法导致的错误,因为Glide已经默认为ImageView设置的Tag。
解决办法:1.自定义一个Application,在里面加上
public class App extends Application {
    @Override public void onCreate() {
        super.onCreate();
        ViewTarget.setTagId(R.id.glide_tag);
    }
}
2.然后在/values/ids.xml加上
<resources>  
    <item type="id" name="glide_tag" />  
</resources>

> 马赛克图与算法:
1. public class PixelateUtil {
    /
      普通图像->像素图,zoneWidth为像素图的大像素的宽度
     /
    public static Bitmap pixelate(Bitmap bitmap, int zoneWidth) {
        return pixelate(bitmap, zoneWidth, 0, 0, bitmap.getWidth(), bitmap.getHeight());
    }
 
    /
      普通图->像素图,left、top、right、bottom可指定打马赛克区域
     /
    public static Bitmap pixelate(Bitmap bitmap, int zoneWidth, int left, int top, int right, int bottom) {
        int w = bitmap.getWidth();
        int h = bitmap.getHeight();
        Bitmap result = bitmap.copy(Bitmap.Config.ARGB_8888, true);
        Canvas canvas = new Canvas(result);
        Paint paint = new Paint();
        for (int i = left; i < right; i += zoneWidth) {
            for (int j = top; j < bottom; j += zoneWidth) {
                int color = bitmap.getPixel(i, j);
                paint.setColor(color);
                int gridRight = Math.min(w, i + zoneWidth);
                int gridBottom = Math.min(h, j + zoneWidth);
                canvas.drawRect(i, j, gridRight, gridBottom, paint);
            }
        }
        return result;
    }
}

Bitmap result = PixelateUtil.pixelate(bitmap, zoneWidth);  //对全图打马赛克
Bitmap result = PixelateUtil.pixelate(bitmap, zoneWidth, left, top, right, bottom); //对指定区域打马赛克

2. Pixelate是实现基本马赛克效果的开源项目,它能够异步对整个或者部分的Bitmap区域打马赛克,处理完后会在OnPixelateListener的onPixelated()中回调,最小的SDK版本为16。
Simple Android library to pixelate images or certain areas of an image- https://github.com/DanielMartinus/Pixelate
new Pixelate(origin)
    .setArea(0,0,origin.getWidth(),origin.getHeight())  //设置区域
    .setDensity(12) //值越大,马赛克单元越小
    .setListener(new OnPixelateListener() {
        @Override
        public void onPixelated(Bitmap bitmap, int density) {
            //bitmap为马赛克图
            Log.v(TAG, "");
        }
    })
    .make();

3. android-close-pixelate能够实现多样式的马赛克效果- https://github.com/bmaslakov/android-close-pixelate
Bitmap pixelated = Pixelate.fromBitmap(
        origin,
        new PixelateLayer.Builder(PixelateLayer.Shape.Circle) //设置马赛克形状
                .setResolution(30) //每个像素的密度(如果该值和size值一样,那么圆形之间相邻)
                .setSize(30) //圆圈的大小
                .build()
);

没有更多推荐了,返回首页