📄 save.c
字号:
int lines, pixels_per_line; unsigned char buff[3]; struct jpeg_compress_struct cinfo; struct jpeg_error_mgr jerr; JSAMPROW row_pointer[1]; // pointer to JSAMPLE row(s) int row_stride; // physical row width in image buffer if(!strcmp(camera->savefile, "")) outfile = stdout; else if(camera->savefile != NULL) outfile = fopen(camera->savefile, "w"); if (outfile == NULL){ errordialog("Could not open file"); return; } cinfo.err = jpeg_std_error(&jerr); jpeg_create_compress(&cinfo); jpeg_stdio_dest(&cinfo, outfile); cinfo.image_width = camera->vid_win.width; cinfo.image_height = camera->vid_win.height; if (camera->greyscale) { cinfo.input_components = 1; cinfo.in_color_space = JCS_GRAYSCALE; } else { cinfo.input_components = 3; cinfo.in_color_space = JCS_RGB; } cinfo.smoothing_factor = camera->save_struct.smoothness; if (camera->save_struct.smoothness) { cinfo.optimize_coding = TRUE; } jpeg_set_defaults(&cinfo); jpeg_set_quality(&cinfo, camera->save_struct.quality, TRUE); jpeg_start_compress(&cinfo, TRUE); row_stride = cinfo.input_components*camera->vid_win.width; while (cinfo.next_scanline < cinfo.image_height) { row_pointer[0] = &camera->pic[cinfo.next_scanline * row_stride]; jpeg_write_scanlines(&cinfo, row_pointer, 1); } jpeg_finish_compress(&cinfo); jpeg_destroy_compress(&cinfo); /* struct jpeg_compress_struct cinfo; struct jpeg_error_mgr jerr; JSAMPROW row_pointer[1]; // pointer to JSAMPLE row(s) int row_stride; // physical row width in image buffer cinfo.err = jpeg_std_error(&jerr); jpeg_create_compress(&cinfo); jpeg_stdio_dest(&cinfo, outf); cinfo.image_width = camera->vid_win.width; cinfo.image_height = camera->vid_win.height; if (camera->greyscale) { cinfo.input_components = 1; cinfo.in_color_space = JCS_GRAYSCALE; } else { cinfo.input_components = 3; cinfo.in_color_space = JCS_RGB; } cinfo.optimize_coding = TRUE; jpeg_set_defaults(&cinfo); jpeg_set_quality(&cinfo, 75, TRUE ); jpeg_start_compress(&cinfo, TRUE); row_stride = cinfo.input_components*camera->vid_win.width; while (cinfo.next_scanline < cinfo.image_height) { row_pointer[0] = &camera->pic[cinfo.next_scanline * row_stride]; jpeg_write_scanlines(&cinfo, row_pointer, 1); } jpeg_finish_compress(&cinfo); jpeg_destroy_compress(&cinfo);*/ fclose(outfile); return;}void save_cancel(GtkWidget *widget, struct Camera *camera){ gtk_widget_destroy(widget->parent->parent->parent); camera->saving = 0; if( !camera->frozen ) pthread_mutex_unlock(&camera->freeze_mutex); return;}void destroy( GtkWidget *widget, gpointer data ){ gtk_main_quit();}void switch_page_png(GtkWidget *widget, struct Camera *camera){ gtk_widget_hide(camera->currentsavepage); gtk_widget_show(camera->page_png.frame_png); camera->currentsavepage = camera->page_png.frame_png; camera->savetype = PNG;}void switch_page_jpeg(GtkWidget *widget, struct Camera *camera){ gtk_widget_hide(camera->currentsavepage); gtk_widget_show(camera->page_jpeg.frame_jpeg); camera->currentsavepage = camera->page_jpeg.frame_jpeg; camera->savetype = JPEG;}void switch_page_ppm(GtkWidget *widget, struct Camera *camera){ gtk_widget_hide(camera->currentsavepage); gtk_widget_show(camera->page_ppm.frame_ppm); camera->currentsavepage = camera->page_ppm.frame_ppm; camera->savetype = PPM;}void save_dialog(GtkWidget *widget, struct Camera *camera){ GtkWidget *notebook; GtkWidget *window; GtkWidget *label; GtkWidget *button; GtkWidget *vbox, *hbox; GtkWidget *typemenu; GtkWidget *typemenubutton; GtkWidget *ppmitem; GtkWidget *jpegitem; GtkWidget *pngitem; //int openpage = camera->savetype; pthread_mutex_lock( &camera->pref_mutex ); if( !camera->frozen ) pthread_mutex_lock(&camera->freeze_mutex); camera->saving = 1; pthread_mutex_unlock( &camera->pref_mutex ); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_policy(GTK_WINDOW(window), FALSE, TRUE, TRUE); gtk_window_set_title (GTK_WINDOW (window), "Gqcam: Save Image"); vbox = gtk_vbox_new(FALSE, 0); gtk_container_add (GTK_CONTAINER (window), vbox); gtk_widget_show(vbox); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 2); label = gtk_label_new("File:"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2); gtk_widget_show(label); camera->save_struct.textbox = gtk_entry_new(); gtk_box_pack_start(GTK_BOX(hbox), camera->save_struct.textbox, FALSE, FALSE, 2); if(camera->save_struct.isinfo) gtk_entry_set_text(GTK_ENTRY(camera->save_struct.textbox), camera->savefileclean); gtk_widget_show(camera->save_struct.textbox); button = gtk_button_new_with_label("Browse..."); gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (file_select), camera); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 2); gtk_widget_show(button); gtk_widget_show(hbox); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 2); typemenubutton = gtk_option_menu_new(); gtk_box_pack_start(GTK_BOX(hbox), typemenubutton, FALSE, FALSE, 2); gtk_widget_show(hbox); typemenu = gtk_menu_new(); pngitem = gtk_menu_item_new_with_label("png"); gtk_menu_append(GTK_MENU(typemenu), pngitem); gtk_signal_connect(GTK_OBJECT (pngitem), "activate", GTK_SIGNAL_FUNC (switch_page_png), camera); gtk_widget_show(pngitem); ppmitem = gtk_menu_item_new_with_label("ppm"); gtk_menu_append(GTK_MENU(typemenu), ppmitem); gtk_signal_connect(GTK_OBJECT (ppmitem), "activate", GTK_SIGNAL_FUNC (switch_page_ppm), camera); gtk_widget_show(ppmitem); jpegitem = gtk_menu_item_new_with_label("jpeg"); gtk_menu_append(GTK_MENU(typemenu), jpegitem); gtk_signal_connect(GTK_OBJECT (jpegitem), "activate", GTK_SIGNAL_FUNC (switch_page_jpeg), camera); gtk_widget_show(jpegitem); gtk_option_menu_set_menu(GTK_OPTION_MENU(typemenubutton), typemenu); gtk_option_menu_set_history(GTK_OPTION_MENU(typemenubutton), camera->savetype); gtk_widget_show(typemenubutton); camera->save_struct.timebutton = gtk_check_button_new_with_label("Append time to filename"); gtk_box_pack_start(GTK_BOX(hbox), camera->save_struct.timebutton, FALSE, FALSE, 2); gtk_widget_show(camera->save_struct.timebutton); /* PPM PAGE */ camera->page_ppm.frame_ppm = gtk_frame_new("Save As"); gtk_frame_set_shadow_type(GTK_FRAME(camera->page_ppm.frame_ppm), GTK_SHADOW_ETCHED_IN); camera->page_ppm.vbox_ppm = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(camera->page_ppm.frame_ppm), camera->page_ppm.vbox_ppm); gtk_widget_show(camera->page_ppm.vbox_ppm); camera->page_ppm.radio_raw_ppm = gtk_radio_button_new_with_label(NULL, "Raw"); gtk_box_pack_start(GTK_BOX(camera->page_ppm.vbox_ppm), camera->page_ppm.radio_raw_ppm, FALSE, FALSE, 2); gtk_widget_show(camera->page_ppm.radio_raw_ppm); camera->page_ppm.group_ppm = gtk_radio_button_group(GTK_RADIO_BUTTON(camera->page_ppm.radio_raw_ppm)); camera->page_ppm.radio_ascii_ppm = gtk_radio_button_new_with_label(camera->page_ppm.group_ppm, "ASCII"); gtk_box_pack_start(GTK_BOX(camera->page_ppm.vbox_ppm), camera->page_ppm.radio_ascii_ppm, FALSE, FALSE, 2); gtk_widget_show(camera->page_ppm.radio_ascii_ppm); if(camera->savetype == PPM){ gtk_widget_show(camera->page_ppm.frame_ppm); camera->currentsavepage = camera->page_ppm.frame_ppm; } gtk_box_pack_start(GTK_BOX(vbox), camera->page_ppm.frame_ppm, FALSE, FALSE, 2); /* JPEG PAGE */ camera->page_jpeg.frame_jpeg = gtk_frame_new(NULL); gtk_frame_set_shadow_type(GTK_FRAME(camera->page_jpeg.frame_jpeg), GTK_SHADOW_ETCHED_IN); camera->page_jpeg.vbox_jpeg = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(camera->page_jpeg.frame_jpeg), camera->page_jpeg.vbox_jpeg); gtk_widget_show(camera->page_jpeg.vbox_jpeg); camera->page_jpeg.table_jpeg = gtk_table_new(3, 3, TRUE); gtk_box_pack_start(GTK_BOX(camera->page_jpeg.vbox_jpeg), camera->page_jpeg.table_jpeg, FALSE, FALSE, 2); gtk_widget_show(camera->page_jpeg.table_jpeg); camera->page_jpeg.label_jpeg = gtk_label_new("Quality"); gtk_table_attach_defaults(GTK_TABLE(camera->page_jpeg.table_jpeg), camera->page_jpeg.label_jpeg, 0, 1, 0, 1); gtk_widget_show(camera->page_jpeg.label_jpeg); camera->page_jpeg.quality_adj_jpeg = gtk_adjustment_new(75, 0, 100, 1, 10, 1); camera->page_jpeg.quality_jpeg = gtk_hscale_new(GTK_ADJUSTMENT(camera->page_jpeg.quality_adj_jpeg)); gtk_scale_set_digits (GTK_SCALE(camera->page_jpeg.quality_jpeg), 0); gtk_table_attach_defaults(GTK_TABLE(camera->page_jpeg.table_jpeg), camera->page_jpeg.quality_jpeg, 1, 3, 0, 1); gtk_widget_show(camera->page_jpeg.quality_jpeg); camera->page_jpeg.label_jpeg = gtk_label_new("Smoothness"); gtk_table_attach_defaults(GTK_TABLE(camera->page_jpeg.table_jpeg), camera->page_jpeg.label_jpeg, 0, 1, 1, 2); gtk_widget_show(camera->page_jpeg.label_jpeg); camera->page_jpeg.smooth_adj_jpeg = gtk_adjustment_new( 0, 0, 100, 1, 10, 1 ); camera->page_jpeg.smooth_jpeg = gtk_hscale_new(GTK_ADJUSTMENT(camera->page_jpeg.smooth_adj_jpeg)); gtk_range_set_update_policy (GTK_RANGE(camera->page_jpeg.smooth_jpeg), GTK_UPDATE_CONTINUOUS); gtk_scale_set_digits (GTK_SCALE(camera->page_jpeg.smooth_jpeg), 0); gtk_scale_set_value_pos (GTK_SCALE(camera->page_jpeg.smooth_jpeg), GTK_POS_TOP); gtk_scale_set_draw_value (GTK_SCALE(camera->page_jpeg.smooth_jpeg), TRUE); gtk_table_attach_defaults(GTK_TABLE(camera->page_jpeg.table_jpeg), camera->page_jpeg.smooth_jpeg, 1, 3, 1, 2); gtk_widget_show(camera->page_jpeg.smooth_jpeg); camera->page_jpeg.optimize_jpeg = gtk_check_button_new_with_label("Optimize"); gtk_table_attach_defaults(GTK_TABLE(camera->page_jpeg.table_jpeg), camera->page_jpeg.optimize_jpeg, 0, 1, 2, 3); gtk_widget_show(camera->page_jpeg.optimize_jpeg); gtk_box_pack_start(GTK_BOX(vbox), camera->page_jpeg.frame_jpeg, FALSE, FALSE, 2); if(camera->savetype == JPEG){ gtk_widget_show(camera->page_jpeg.frame_jpeg); camera->currentsavepage = camera->page_jpeg.frame_jpeg; }/* PNG PAGE */ camera->page_png.frame_png = gtk_frame_new(NULL); gtk_frame_set_shadow_type(GTK_FRAME(camera->page_png.frame_png), GTK_SHADOW_ETCHED_IN); camera->page_png.vbox_png = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(camera->page_png.frame_png), camera->page_png.vbox_png); gtk_widget_show(camera->page_png.vbox_png); camera->page_png.interlace_png = gtk_check_button_new_with_label("Interlace"); gtk_box_pack_start(GTK_BOX(camera->page_png.vbox_png), camera->page_png.interlace_png, FALSE, FALSE, 2); gtk_widget_show(camera->page_png.interlace_png); camera->page_png.hbox_png = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(camera->page_png.vbox_png), camera->page_png.hbox_png, FALSE, FALSE, 2); gtk_widget_show(camera->page_png.hbox_png); camera->page_png.label_png = gtk_label_new("Compression"); gtk_box_pack_start(GTK_BOX(camera->page_png.hbox_png), camera->page_png.label_png, FALSE, FALSE, 2); gtk_widget_show(camera->page_png.label_png); camera->page_png.compression_adj_png = gtk_adjustment_new(6, 0, 10, 1, 1, 1); camera->page_png.compression_png = gtk_hscale_new(GTK_ADJUSTMENT(camera->page_png.compression_adj_png)); gtk_range_set_update_policy (GTK_RANGE(camera->page_png.compression_png), GTK_UPDATE_CONTINUOUS); gtk_scale_set_digits (GTK_SCALE(camera->page_png.compression_png), 0); gtk_scale_set_value_pos (GTK_SCALE(camera->page_png.compression_png), GTK_POS_TOP); gtk_scale_set_draw_value(GTK_SCALE(camera->page_png.compression_png), TRUE); //gtk_table_attach_defaults(GTK_TABLE(camera->page_jpeg.table_jpeg), camera->page_jpeg.smooth_jpeg, 1, 3, 1, 2); gtk_box_pack_start(GTK_BOX(camera->page_png.hbox_png), camera->page_png.compression_png, TRUE, TRUE, 2); gtk_widget_show(camera->page_png.compression_png); gtk_box_pack_start(GTK_BOX(vbox), camera->page_png.frame_png, FALSE, FALSE, 2); if(camera->savetype == PNG){ gtk_widget_show(camera->page_png.frame_png); camera->currentsavepage = camera->page_png.frame_png; } /* GIF PAGE *//* page_gif.frame_gif = gtk_frame_new(NULL); gtk_frame_set_shadow_type(GTK_FRAME(page_gif.frame_gif), GTK_SHADOW_NONE); gtk_widget_show(page_gif.frame_gif); page_gif.vbox_gif = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(page_gif.frame_gif), page_gif.vbox_gif); gtk_widget_show(page_gif.vbox_gif); page_gif.interlace_gif = gtk_check_button_new_with_label("Interlace"); gtk_box_pack_start(GTK_BOX(page_gif.vbox_gif), page_gif.interlace_gif, FALSE, FALSE, 2); gtk_widget_show(page_gif.interlace_gif); page_gif.comment_gif = gtk_check_button_new_with_label("Comment:"); gtk_box_pack_start(GTK_BOX(page_gif.vbox_gif), page_gif.comment_gif, FALSE, FALSE, 2); gtk_widget_show(page_gif.comment_gif); page_gif.comment_text_gif = gtk_text_new( NULL, NULL); gtk_box_pack_start(GTK_BOX(page_gif.vbox_gif), page_gif.comment_text_gif, FALSE, FALSE, 2); gtk_text_set_editable(GTK_TEXT(page_gif.comment_text_gif), TRUE); gtk_widget_set_usize(GTK_WIDGET(page_gif.comment_text_gif), 100, 50); gtk_widget_show(page_gif.comment_text_gif); page_gif.label_gif = gtk_label_new("Gif"); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_gif.frame_gif, page_gif.label_gif);*//* END PAGES *//* gtk_notebook_set_page(GTK_NOTEBOOK(notebook), camera->savetype);*/ hbox = gtk_hbox_new(TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 2); gtk_widget_show(hbox); button = gtk_button_new_with_label("Ok"); gtk_signal_connect(GTK_OBJECT(button), "clicked", save_ok, camera); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, TRUE, 5); gtk_widget_show(button); button = gtk_button_new_with_label("Cancel"); gtk_signal_connect(GTK_OBJECT(button), "clicked", save_cancel, camera); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, TRUE, 5); gtk_widget_show(button); gtk_widget_show(window); return;}void savefile_append_time(struct Camera *camera){ char *dotlocation; char prefix[255+11], curtime[10]; int length; dotlocation = strrchr(camera->savefileclean, '.'); if(dotlocation == NULL) length = strlen(camera->savefileclean); else length = (dotlocation - camera->savefileclean)/(sizeof(char)); strncpy(prefix, camera->savefileclean, length); sprintf(curtime, ".%d", time(NULL)); strcpy(prefix+length, curtime); strcpy(prefix+length+strlen(curtime), camera->savefileclean+length); //printf("%s\n", prefix); strcpy(camera->savefile, prefix); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -