Java Android:将位图保存到SD卡时,图像质量非常差
我正在为Android制作一个OCR应用程序,它将截取一些文本,识别它们并在谷歌上搜索一个关键词。如果你还没有意识到的话,我正在尝试制作一个“谷歌现在点击”的克隆 为了使OCR更好地工作,我首先旋转图像,然后过滤图像。首先去掉状态栏和导航栏,然后将其转换为灰度,然后锐化 但滤波后的图像质量极为像素化,这极大地影响了OCR的精度 这是我收到的一封IFTTT电子邮件前后的图片 正如您所看到的,before图像的质量要比经过过滤和旋转的图像高很多 以下是我旋转、过滤和保存图像的代码: 首先拍摄截图,然后保存截图Java Android:将位图保存到SD卡时,图像质量非常差,java,android,image,filter,Java,Android,Image,Filter,我正在为Android制作一个OCR应用程序,它将截取一些文本,识别它们并在谷歌上搜索一个关键词。如果你还没有意识到的话,我正在尝试制作一个“谷歌现在点击”的克隆 为了使OCR更好地工作,我首先旋转图像,然后过滤图像。首先去掉状态栏和导航栏,然后将其转换为灰度,然后锐化 但滤波后的图像质量极为像素化,这极大地影响了OCR的精度 这是我收到的一封IFTTT电子邮件前后的图片 正如您所看到的,before图像的质量要比经过过滤和旋转的图像高很多 以下是我旋转、过滤和保存图像的代码: 首先拍摄截图,
public void getScreenshot()
{
try
{
Process sh = Runtime.getRuntime().exec("su", null, null);
OutputStream os = sh.getOutputStream();
os.write(("/system/bin/screencap -p " + _path).getBytes("ASCII"));
os.flush();
os.close();
sh.waitFor();
onPhotoTaken();
Toast.makeText(this, "Screenshot taken", Toast.LENGTH_SHORT).show();
}
catch (IOException e)
{
System.out.println("IOException");
}
catch (InterruptedException e)
{
System.out.println("InterruptedException");
}
}
然后,旋转图像:
protectedvoid onphototake(){
_假设为真;
BitmapFactory.Options=new-BitmapFactory.Options();
options.inSampleSize=4;
位图位图=位图工厂.decodeFile(_路径,选项);
试一试{
ExifInterface exif=新的ExifInterface(_路径);
int exiforOrientation=exif.getAttributeInt(
ExifInterface.TAG_方向,
ExiFinInterface.方向(U法线);
Log.v(标签“方向:+EXIFORIENTION”);
int=0;
开关(出口方向){
外壳出口接口。方向旋转90:
旋转=90;
打破
外壳出口接口.方向旋转180:
旋转=180;
打破
外壳出口接口方向旋转270:
旋转=270;
打破
}
对数v(标签“旋转:”+旋转);
如果(旋转!=0){
//获取给定图像的宽度和高度。
int w=bitmap.getWidth();
int h=bitmap.getHeight();
//设置预旋转
矩阵mtx=新矩阵();
mtx.预旋转(旋转);
//旋转位图
位图=位图。创建位图(位图,0,0,w,h,mtx,false);
}
//转换为ATES要求的ARGB_8888
bitmap=bitmap.copy(bitmap.Config.ARGB_8888,true);
}捕获(IOE异常){
Log.e(标记“无法更正方向:”+e.toString());
}
//_image.setImageBitmap(位图);
设置图像过滤器(位图);
}
看起来jpeg压缩确实把图像搞乱了。尝试使用更适合边缘锐利的图像的格式,例如文本。我会推荐png甚至gif。您还可以存储未压缩的BMP
Jpeg压缩的工作原理是,在大多数图片(自然、人、对象)中,锐利的边缘不是人眼所能看到的。这使得存储边缘锐利的内容(如文本)变得非常糟糕
此外,图像过滤器有效地消除了图像的抗锯齿,从而进一步降低了可感知的图像质量。然而,这可能是您想要做的,因为它可能会使OCR更容易
我也错过了抽样的大小,因为你上传的图片大小与网站上的相同。从:
如果设置为大于1的值,则请求解码器对原始数据进行二次采样
图像,返回较小的图像以节省内存。样本量为
任一维中对应于单个像素的像素数
解码位图中的像素。例如,inSampleSize==4返回一个
图像的宽度/高度为原稿的1/4,宽度/高度为原稿的1/16
像素数。任何值看起来都像是jpeg压缩将图像弄乱了。尝试使用更适合边缘锐利的图像的格式,例如文本。我会推荐png甚至gif。您还可以存储未压缩的BMP Jpeg压缩的工作原理是,在大多数图片(自然、人、对象)中,锐利的边缘不是人眼所能看到的。这使得存储边缘锐利的内容(如文本)变得非常糟糕 此外,图像过滤器有效地消除了图像的抗锯齿,从而进一步降低了可感知的图像质量。然而,这可能是您想要做的,因为它可能会使OCR更容易 我也错过了抽样的大小,因为你上传的图片大小与网站上的相同。从: 如果设置为大于1的值,则请求解码器对原始数据进行二次采样 图像,返回较小的图像以节省内存。样本量为 任一维中对应于单个像素的像素数 解码位图中的像素。例如,inSampleSize==4返回一个 图像的宽度/高度为原稿的1/4,宽度/高度为原稿的1/16
像素数。任何值看起来都像是jpeg压缩将图像弄乱了。尝试使用更适合边缘锐利的图像的格式,例如文本。我会推荐png甚至gif。您还可以存储未压缩的BMP Jpeg压缩的工作原理是,在大多数图片(自然、人、对象)中,锐利的边缘不是人眼所能看到的。这使得存储边缘锐利的内容(如文本)变得非常糟糕 此外,图像过滤器有效地消除了图像的抗锯齿,从而进一步降低了可感知的图像质量。然而,这可能是您想要做的,因为它可能会使OCR更容易 我也错过了抽样的大小,因为你上传的图片大小与网站上的相同。从: 如果设置为大于1的值,则请求解码器对原始数据进行二次采样 图像,返回较小的图像以节省内存。样本量为 任一维中对应于单个像素的像素数 解码位图中的像素。例如,inSampleSize==4返回一个 图像的宽度/高度为原稿的1/4,宽度/高度为原稿的1/16
像素数。任何值看起来都像是jpeg压缩将图像弄乱了。尝试使用更适合边缘锐利的图像的格式,例如文本。我会推荐png甚至gif。你可能会患als