0

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();
    }
}
4

1 に答える 1

0

私は OpenCV / Android-JNI を知らないので、ヒントを与えることができます。

この関数saveBitmapToFileは、ブリキに書かれていることを実行すると思います。ビットマップを(BMPファイル形式のように)そのまま保存します。最初に圧縮する必要がありますbmp。おそらく、これで正しい方向に進むことができます。

なぜ新しいファイルが大きくなったのかについて: 本当に知りたい (そしてそれを修正する方法だけに興味がない) 場合は、任意の Hex エディターを起動して、ファイルのヘッダーを見てください。ビットマップは、プロセス中に変更された可能性のあるさまざまなビット深度と圧縮を使用します。

于 2012-05-11T06:14:25.650 に答える