1
0
Fork 0
mirror of https://github.com/ruby-opencv/ruby-opencv synced 2023-03-27 23:22:12 -04:00

change CvMat#save_image to set format-specific save parameters

This commit is contained in:
ser1zw 2012-08-30 17:03:56 +09:00
parent 020ba99fc1
commit b63e197680
3 changed files with 47 additions and 14 deletions

View file

@ -413,7 +413,7 @@ void define_ruby_class()
rb_define_method(rb_klass, "extract_surf", RUBY_METHOD_FUNC(rb_extract_surf), -1);
rb_define_method(rb_klass, "save_image", RUBY_METHOD_FUNC(rb_save_image), 1);
rb_define_method(rb_klass, "save_image", RUBY_METHOD_FUNC(rb_save_image), -1);
rb_define_alias(rb_klass, "save", "save_image");
rb_define_method(rb_klass, "encode_image", RUBY_METHOD_FUNC(rb_encode_imageM), -1);
@ -1496,7 +1496,7 @@ rb_set_bang(int argc, VALUE *argv, VALUE self)
/*
* call-seq:
* save_image(<i>filename</i>) -> self
* save_image(<i>filename, params = nil</i>) -> self
*
* Saves an image to file. The image format is chosen depending on the filename extension.
* Only 8bit single-channel or 3-channel(with 'BGR' channel order) image can be saved.
@ -1507,15 +1507,31 @@ rb_set_bang(int argc, VALUE *argv, VALUE self)
* image.save_image("image.png") #=> save as PNG format
*/
VALUE
rb_save_image(VALUE self, VALUE filename)
rb_save_image(int argc, VALUE *argv, VALUE self)
{
Check_Type(filename, T_STRING);
VALUE _filename, _params;
rb_scan_args(argc, argv, "11", &_filename, &_params);
Check_Type(_filename, T_STRING);
int *params = NULL;
if (!NIL_P(_params)) {
params = hash_to_format_specific_param(_params);
}
try {
cvSaveImage(StringValueCStr(filename), CVARR(self));
cvSaveImage(StringValueCStr(_filename), CVARR(self), params);
}
catch (cv::Exception& e) {
if (params != NULL) {
free(params);
params = NULL;
}
raise_cverror(e);
}
if (params != NULL) {
free(params);
params = NULL;
}
return self;
}

View file

@ -240,7 +240,7 @@ VALUE rb_compute_correspond_epilines(VALUE klass, VALUE points, VALUE which_imag
VALUE rb_extract_surf(int argc, VALUE *argv, VALUE self);
// HighGUI function
VALUE rb_save_image(VALUE self, VALUE filename);
VALUE rb_save_image(int argc, VALUE *argv, VALUE self);
VALUE new_object(int rows, int cols, int type);
VALUE new_object(CvSize size, int type);

View file

@ -88,19 +88,36 @@ class TestCvMat < OpenCVTestCase
end
def test_save_image
filename = 'save_image_test.jpg'
filename_jpg = 'save_image_test.jpg'
filename_png = 'save_image_test.png'
m = CvMat.new(20, 20, :cv8u, 1)
File.delete filename if File.exists? filename
m.save_image filename
assert(File.exists? filename)
File.delete filename_jpg if File.exists? filename_jpg
m.save_image filename_jpg
assert(File.exists? filename_jpg)
File.delete filename_jpg if File.exists? filename_jpg
m.save_image(filename_jpg, CV_IMWRITE_JPEG_QUALITY => 10)
assert(File.exists? filename_jpg)
File.delete filename_png if File.exists? filename_png
m.save_image(filename_png, CV_IMWRITE_PNG_COMPRESSION => 9)
assert(File.exists? filename_png)
# Alias
File.delete filename if File.exists? filename
m.save filename
assert(File.exists? filename)
File.delete filename_jpg if File.exists? filename_jpg
m.save filename_jpg
assert(File.exists? filename_jpg)
File.delete filename
assert_raise(TypeError) {
m.save_image(DUMMY_OBJ)
}
assert_raise(TypeError) {
m.save_image(filename_jpg, DUMMY_OBJ)
}
File.delete filename_jpg if File.exists? filename_jpg
File.delete filename_png if File.exists? filename_png
end
def test_encode