opencv (android-jni) を使用して Bitmapfile のサイズを変更し、出力ビットマップを /mnt/sdcard/org.jpg という名前のファイルに保存します。
次に使用する
resultBitmap = BitmapFactory.decodeFile("/mnt/sdcard/org.jpg");
ビットマップを取得し、このresultBitmapをファイル/mnt/sdcard/result.jpgに再保存します
org.jpg のサイズは 100k で、result.jpg のサイズは約 300k です。
なぜ?
私のサイズ変更方法は、次のように jni で opencv を使用します。
int FUN_ENTRY JNICALL Java_com_funlib_imagefilter_ImageUtily_nativeResizeBitmap(
JNIEnv* env, jobject obj , jstring srcPath , jstring destPath, int w , int h , int quality)
{
char* srcPath1 = jstringTostring(env , srcPath);
IplImage *src = cvLoadImage(srcPath1,CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
if(srcPath1!=NULL)
{
free(srcPath1);
srcPath1 = NULL;
}
if(src==NULL)
{
return -1;
}
CvSize sz;
double rate1 = ((double) src->width) / (double) w + 0.1;
double rate2 = ((double) src->height) / (double) h + 0.1;
double rate = rate1 > rate2 ? rate1 : rate2;
sz.width = (int) (((double) src->width) / rate);
sz.height = (int) (((double) src->height) / rate);
IplImage *desc = cvCreateImage(sz,src->depth,src->nChannels);
if(desc==NULL)
{
cvReleaseImage(&src);
return -1;
}
cvResize(src,desc,CV_INTER_CUBIC);
if(desc==NULL)
{
cvReleaseImage(&src);
return -1;
}
char* destPath1 = jstringTostring(env , destPath);
int p[3];
p[0] = CV_IMWRITE_JPEG_QUALITY;
p[1] = quality;
p[2] = 0;
cvSaveImage(destPath1 , desc , p);
cvReleaseImage(&src);
cvReleaseImage(&desc);
if(destPath1!=NULL)
{
free(destPath1);
destPath1 = NULL;
}
return 0;
}
そして私のメインは
File f = new File(filePath);
String tmpDestPath = f.getParent();
if(!tmpDestPath.endsWith(File.separator))
tmpDestPath += File.separator;
tmpDestPath += "org.jpg";
int ret = nativeResizeBitmap(filePath, tmpDestPath, width, height , quality); //get the org.jpg file
Bitmap bmp = null;
if(ret == 0){
bmp = BitmapFactory.decodeFile(tmpDestPath);
}
try {
ImageUtily.saveBitmapToFile("result", bmp); //get the result.jpg file
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
私のsaveBitmapToFileは
public static void saveBitmapToFile(String fileName, Bitmap bmp) throws IOException
{
File f = new File("/sdcard/DCIM/TEMP/" + fileName + ".jpg");
f.createNewFile();
FileOutputStream fOut = null;
try {
fOut = new FileOutputStream(f);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
bmp.compress(Bitmap.CompressFormat.JPEG, 100, fOut);
try {
fOut.flush();
} catch (IOException e) {
e.printStackTrace();
}
try {
fOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}