diff --git a/atom/common/api/atom_api_native_image.cc b/atom/common/api/atom_api_native_image.cc index 77ce366061..8ec7a96afa 100644 --- a/atom/common/api/atom_api_native_image.cc +++ b/atom/common/api/atom_api_native_image.cc @@ -79,6 +79,8 @@ float GetScaleFactorFromPath(const base::FilePath& path) { bool AddImageSkiaRep(gfx::ImageSkia* image, const unsigned char* data, size_t size, + int width, + int height, double scale_factor) { std::unique_ptr decoded(new SkBitmap()); @@ -87,8 +89,17 @@ bool AddImageSkiaRep(gfx::ImageSkia* image, // Try JPEG. decoded = gfx::JPEGCodec::Decode(data, size); - if (!decoded) - return false; + if (!decoded) { + // Try Bitmap + if (width > 0 && height > 0) { + decoded.reset(new SkBitmap); + decoded->allocN32Pixels(width, height, false); + decoded->setPixels( + const_cast(reinterpret_cast(data))); + } else { + return false; + } + } image->AddRepresentation(gfx::ImageSkiaRep(*decoded, scale_factor)); return true; @@ -104,7 +115,7 @@ bool AddImageSkiaRep(gfx::ImageSkia* image, const unsigned char* data = reinterpret_cast(file_contents.data()); size_t size = file_contents.size(); - return AddImageSkiaRep(image, data, size, scale_factor); + return AddImageSkiaRep(image, data, size, 0, 0, scale_factor); } bool PopulateImageSkiaRepsFromPath(gfx::ImageSkia* image, @@ -395,6 +406,13 @@ mate::Handle NativeImage::CreateFromPath( // static mate::Handle NativeImage::CreateFromBuffer( mate::Arguments* args, v8::Local buffer) { + int width = 0; + int height = 0; + if (args->Length() >= 3) { + args->GetNext(&width); + args->GetNext(&height); + } + double scale_factor = 1.; args->GetNext(&scale_factor); @@ -402,6 +420,8 @@ mate::Handle NativeImage::CreateFromBuffer( AddImageSkiaRep(&image_skia, reinterpret_cast(node::Buffer::Data(buffer)), node::Buffer::Length(buffer), + width, + height, scale_factor); return Create(args->isolate(), gfx::Image(image_skia)); } diff --git a/docs/api/native-image.md b/docs/api/native-image.md index 54d7631f49..495cce5645 100644 --- a/docs/api/native-image.md +++ b/docs/api/native-image.md @@ -137,15 +137,17 @@ let image = nativeImage.createFromPath('/Users/somebody/images/icon.png') console.log(image) ``` -### `nativeImage.createFromBuffer(buffer[, scaleFactor])` +### `nativeImage.createFromBuffer(buffer[width, height, scaleFactor])` * `buffer` [Buffer][buffer] +* `width` Integer (optional) +* `height` Integer (optional) * `scaleFactor` Double (optional) Returns `NativeImage` Creates a new `NativeImage` instance from `buffer`. The default `scaleFactor` is -1.0. +1.0. If `buffer` is a bitmap, specify `width` and `height` of the image. ### `nativeImage.createFromDataURL(dataURL)` diff --git a/spec/api-native-image-spec.js b/spec/api-native-image-spec.js index 3ee5e55c25..e9c6362310 100644 --- a/spec/api-native-image-spec.js +++ b/spec/api-native-image-spec.js @@ -25,6 +25,9 @@ describe('nativeImage module', () => { const imageC = nativeImage.createFromBuffer(imageA.toJPEG(100)) assert.deepEqual(imageC.getSize(), {width: 538, height: 190}) + + const imageD = nativeImage.createFromBuffer(imageA.toBitmap(), 538, 190) + assert.deepEqual(imageD.getSize(), {width: 538, height: 190}) }) })