編輯:關於Android編程
前一篇最後 我們說了一個直接將yuv轉成jpg的函數 但是轉換沒有成功 原函數是yuv420轉jpg的 研究了下發現
yuv420隔行掃描的的序列是這樣的
YYYY
YYYY
UVUV
而yuv422的隔行掃描的序列是這樣的
YU YV YU YV YU YV
所以將函數作如下修改
static int put_jpeg_yuv420p_memory(unsigned char *dest_image, unsigned char *input_image, int width, int height) { int i, j, jpeg_image_size; JSAMPROW y[16],cb[16],cr[16]; // y[2][5] = color sample of row 2 and pixel column 5; (one plane) JSAMPARRAY data[3]; // t[0][2][5] = color sample 0 of row 2 and column 5 struct jpeg_compress_struct cinfo; struct jpeg_error_mgr jerr; char *pbuf = NULL; int jpglen = 0; data[0] = y; data[1] = cb; data[2] = cr; cinfo.err = jpeg_std_error(&jerr); // errors get written to stderr jpeg_create_compress(&cinfo); cinfo.image_width = width; cinfo.image_height = height; cinfo.input_components = 3; jpeg_set_defaults (&cinfo); jpeg_set_colorspace(&cinfo, JCS_YCbCr); cinfo.raw_data_in = TRUE; // supply downsampled data cinfo.do_fancy_downsampling = FALSE; // fix segfaulst with v7 cinfo.comp_info[0].h_samp_factor = 2; cinfo.comp_info[0].v_samp_factor = 2; cinfo.comp_info[1].h_samp_factor = 1; cinfo.comp_info[1].v_samp_factor = 1; cinfo.comp_info[2].h_samp_factor = 1; cinfo.comp_info[2].v_samp_factor = 1; jpeg_set_quality(&cinfo, 80, TRUE); cinfo.dct_method = JDCT_FASTEST; jpeg_mem_dest(&cinfo, &pbuf, &jpglen); // data written to mem jpeg_start_compress (&cinfo, TRUE); for (j = 0; j < height; j += 16) { for (i = 0; i < 16; i++) { y[i] = input_image + width * (i + j); //cb[i/2] = input_image + width * height + width / 2 * ((i + j) / 2); //cr[i/2] = input_image + width * height + width * height / 4 + width / 2 * ((i + j) / 2); if (i%2 == 0) cb[i/2] = input_image + width * ((i + j) / 2); else cr[i/2] = input_image + width * ((i + j) / 2); } jpeg_write_raw_data(&cinfo, data, 16); } jpeg_finish_compress(&cinfo); jpeg_destroy_compress(&cinfo); memcpy(dest_image,pbuf,jpglen); if(pbuf) free(pbuf); return jpglen; }即可將yuv422直接轉化成jpg
JNIEXPORT jint JNICALL Java_com_hclydao_usbcamera_Fimcgzsd_writefile(JNIEnv * env, jclass obj,jbyteArray yuvdata,jbyteArray filename)//jintArray rgbdata { jbyte *ydata = (jbyte*)(*env)->GetByteArrayElements(env, yuvdata, 0); jbyte *filedir = (jbyte*)(*env)->GetByteArrayElements(env, filename, 0); FILE * outfile; if ((outfile = fopen(filedir, "wb")) == NULL) { LOGE("++++++++++++open %s failed\n",filedir); return -1; } unsigned char* dst = malloc(mwidth*mheight*3*sizeof(char)); int size = put_jpeg_yuv420p_memory(dst,ydata,mwidth,mheight); fwrite(dst,size,1,outfile); if(dst)free(dst); if(jpgdata)free(jpgdata); fclose(outfile); (*env)->ReleaseByteArrayElements(env, yuvdata, ydata, 0); (*env)->ReleaseByteArrayElements(env, filename, filedir, 0); }還是要靜下心來研究
ArrayMap的介紹官方對ArrayMap也有說明:它不是一個適應大數據的數據結構,相比傳統的HashMap速度要慢,因為查找方法是二分法,並且當你刪除或者添加數據時,
Notification是在你的應用常規界面之外展示的消息。當app讓系統發送一個消息的時候,消息首先以圖表的形式顯示在通知欄。要查看消息的詳情需要進入通知抽屜(noti
騰訊手機管家,初始界面有個小飛機動啊動啊,還挺好玩的,而且顯示新特征為豎向展示,不知道這種東西該如何實現呢?給自己留下比較深的印象,然後樓主就是探索這種是如何實現的。
是什麼BroadCastReceiver是四大組件之一,相當於一個全局的監聽器,用於監聽系統全局的廣播。怎麼樣由於BroadCastReceiver是全局監聽器,因此它可