2015-11-12 13:20:09 +00:00
# nativeImage
2014-06-23 14:58:42 +00:00
2016-04-21 22:39:12 +00:00
> Create tray, dock, and application icons using PNG or JPG files.
2016-04-21 22:35:29 +00:00
2016-11-23 19:20:56 +00:00
Process: [Main ](../glossary.md#main-process ), [Renderer ](../glossary.md#renderer-process )
2016-11-03 17:26:00 +00:00
2024-03-12 16:33:56 +00:00
The `nativeImage` module provides a unified interface for manipulating
system images. These can be handy if you want to provide multiple scaled
versions of the same icon or take advantage of macOS [template images][template-image].
2014-06-23 14:58:42 +00:00
2024-03-12 16:33:56 +00:00
Electron APIs that take image files accept either file paths or
`NativeImage` instances. An empty and transparent image will be used when `null` is passed.
2014-06-23 14:58:42 +00:00
2024-03-12 16:33:56 +00:00
For example, when creating a [Tray ](../api/tray.md ) or setting a [BrowserWindow ](../api/browser-window.md )'s
icon, you can either pass an image file path as a string:
```js title='Main Process'
2018-09-13 16:10:51 +00:00
const { BrowserWindow, Tray } = require('electron')
2016-07-26 01:39:25 +00:00
2024-03-12 16:33:56 +00:00
const tray = new Tray('/Users/somebody/images/icon.png')
2019-08-19 22:15:13 +00:00
const win = new BrowserWindow({ icon: '/Users/somebody/images/window.png' })
2014-06-23 14:58:42 +00:00
```
2024-03-12 16:33:56 +00:00
or generate a `NativeImage` instance from the same file:
2014-06-23 14:58:42 +00:00
2024-03-12 16:33:56 +00:00
```js title='Main Process'
const { BrowserWindow, nativeImage, Tray } = require('electron')
const trayIcon = nativeImage.createFromPath('/Users/somebody/images/icon.png')
const appIcon = nativeImage.createFromPath('/Users/somebody/images/window.png')
const tray = new Tray(trayIcon)
const win = new BrowserWindow({ icon: appIcon })
2015-02-12 05:52:28 +00:00
```
2015-01-03 03:15:09 +00:00
2015-09-01 23:21:29 +00:00
## Supported Formats
2015-02-12 05:52:28 +00:00
2024-03-12 16:33:56 +00:00
Currently, `PNG` and `JPEG` image formats are supported across all platforms.
`PNG` is recommended because of its support for transparency and lossless compression.
2015-08-08 16:08:09 +00:00
2016-07-22 20:42:27 +00:00
On Windows, you can also load `ICO` icons from file paths. For best visual
2024-03-12 16:33:56 +00:00
quality, we recommend including at least the following sizes:
2016-08-01 11:13:40 +00:00
* Small icon
2019-08-19 22:15:13 +00:00
* 16x16 (100% DPI scale)
* 20x20 (125% DPI scale)
* 24x24 (150% DPI scale)
* 32x32 (200% DPI scale)
2016-08-01 11:13:40 +00:00
* Large icon
2019-08-19 22:15:13 +00:00
* 32x32 (100% DPI scale)
* 40x40 (125% DPI scale)
* 48x48 (150% DPI scale)
* 64x64 (200% DPI scale)
* 256x256
2014-06-23 14:58:42 +00:00
2024-03-12 16:33:56 +00:00
Check the _Icon Scaling_ section in the Windows [App Icon Construction][icons] reference.
2016-08-01 11:13:40 +00:00
2024-03-12 16:33:56 +00:00
[icons]: https://learn.microsoft.com/en-us/windows/apps/design/style/iconography/app-icon-construction#icon-scaling
2016-08-01 11:13:40 +00:00
2024-02-08 13:59:46 +00:00
:::note
EXIF metadata is currently not supported and will not be taken into account during
image encoding and decoding.
:::
2015-09-01 23:21:29 +00:00
## High Resolution Image
2014-06-23 14:58:42 +00:00
2024-03-12 16:33:56 +00:00
On platforms that support high pixel density displays (such as Apple Retina),
you can append `@2x` after image's base filename to mark it as a 2x scale
high resolution image.
2014-06-23 14:58:42 +00:00
2019-08-19 22:15:13 +00:00
For example, if `icon.png` is a normal image that has standard resolution, then
2024-03-12 16:33:56 +00:00
`icon@2x.png` will be treated as a high resolution image that has double
Dots per Inch (DPI) density.
2014-08-06 03:20:00 +00:00
2015-08-31 03:52:46 +00:00
If you want to support displays with different DPI densities at the same time,
you can put images with different sizes in the same folder and use the filename
2024-03-12 16:33:56 +00:00
without DPI suffixes within Electron. For example:
2014-08-06 03:20:00 +00:00
2019-07-30 20:11:56 +00:00
```plaintext
2014-08-06 03:20:00 +00:00
images/
├── icon.png
├── icon@2x.png
└── icon@3x.png
```
2024-03-12 16:33:56 +00:00
```js title='Main Process'
2018-09-13 16:10:51 +00:00
const { Tray } = require('electron')
2024-03-12 16:33:56 +00:00
const appTray = new Tray('/Users/somebody/images/icon.png')
2014-08-06 03:20:00 +00:00
```
2019-08-19 22:15:13 +00:00
The following suffixes for DPI are also supported:
2014-08-06 03:20:00 +00:00
* `@1x`
* `@1.25x`
* `@1.33x`
* `@1.4x`
* `@1.5x`
* `@1.8x`
* `@2x`
* `@2.5x`
* `@3x`
2015-01-03 03:15:09 +00:00
* `@4x`
* `@5x`
2024-03-12 16:33:56 +00:00
## Template Image _macOS_
2015-01-03 03:15:09 +00:00
2024-03-12 16:33:56 +00:00
On macOS, [template images][template-image] consist of black and an alpha channel.
2015-01-03 03:15:09 +00:00
Template images are not intended to be used as standalone images and are usually
mixed with other content to create the desired final appearance.
2024-03-12 16:33:56 +00:00
The most common case is to use template images for a menu bar (Tray) icon, so it can
2015-08-31 03:52:46 +00:00
adapt to both light and dark menu bars.
2015-01-03 03:15:09 +00:00
2024-03-12 16:33:56 +00:00
To mark an image as a template image, its base filename should end with the word
`Template` (e.g. `xxxTemplate.png` ). You can also specify template images at
different DPI densities (e.g. `xxxTemplate@2x.png` ).
2015-02-12 05:52:28 +00:00
2015-08-29 04:33:45 +00:00
## Methods
2016-07-22 20:42:27 +00:00
The `nativeImage` module has the following methods, all of which return
2024-03-12 16:33:56 +00:00
an instance of the [`NativeImage` ](#class-nativeimage ) class:
2015-08-29 04:33:45 +00:00
2015-11-12 13:20:09 +00:00
### `nativeImage.createEmpty()`
2015-02-12 05:55:45 +00:00
2016-09-24 23:59:30 +00:00
Returns `NativeImage`
2016-07-22 20:42:27 +00:00
Creates an empty `NativeImage` instance.
2015-02-12 05:55:45 +00:00
2023-03-09 02:48:29 +00:00
### `nativeImage.createThumbnailFromPath(path, size)` _macOS_ _Windows_
2020-08-24 16:36:13 +00:00
2021-11-16 04:13:18 +00:00
* `path` string - path to a file that we intend to construct a thumbnail out of.
2023-03-09 02:48:29 +00:00
* `size` [Size ](structures/size.md ) - the desired width and height (positive numbers) of the thumbnail.
2020-08-24 16:36:13 +00:00
Returns `Promise<NativeImage>` - fulfilled with the file's thumbnail preview image, which is a [NativeImage ](native-image.md ).
2023-03-09 02:48:29 +00:00
Note: The Windows implementation will ignore `size.height` and scale the height according to `size.width` .
2015-11-12 13:20:09 +00:00
### `nativeImage.createFromPath(path)`
2015-02-12 05:52:28 +00:00
2024-03-12 16:33:56 +00:00
* `path` string - path to a file that we intend to construct an image out of.
2015-02-12 05:52:28 +00:00
2016-09-24 23:59:30 +00:00
Returns `NativeImage`
2016-09-21 17:48:01 +00:00
Creates a new `NativeImage` instance from a file located at `path` . This method
returns an empty image if the `path` does not exist, cannot be read, or is not
a valid image.
2015-02-12 05:52:28 +00:00
2023-11-21 07:50:08 +00:00
```js
2024-03-12 16:33:56 +00:00
const { nativeImage } = require('electron')
2016-07-26 01:39:25 +00:00
2019-08-19 22:15:13 +00:00
const image = nativeImage.createFromPath('/Users/somebody/images/icon.png')
2016-07-26 01:39:25 +00:00
console.log(image)
2016-06-08 16:34:45 +00:00
```
2019-03-14 18:00:38 +00:00
### `nativeImage.createFromBitmap(buffer, options)`
* `buffer` [Buffer][buffer]
* `options` Object
* `width` Integer
* `height` Integer
2022-07-26 07:57:01 +00:00
* `scaleFactor` Number (optional) - Defaults to 1.0.
2019-03-14 18:00:38 +00:00
Returns `NativeImage`
Creates a new `NativeImage` instance from `buffer` that contains the raw bitmap
pixel data returned by `toBitmap()` . The specific format is platform-dependent.
2016-12-14 18:12:37 +00:00
### `nativeImage.createFromBuffer(buffer[, options])`
2015-02-12 05:52:28 +00:00
* `buffer` [Buffer][buffer]
2016-12-13 20:30:45 +00:00
* `options` Object (optional)
2016-12-14 18:19:38 +00:00
* `width` Integer (optional) - Required for bitmap buffers.
* `height` Integer (optional) - Required for bitmap buffers.
2022-07-26 07:57:01 +00:00
* `scaleFactor` Number (optional) - Defaults to 1.0.
2015-02-12 05:52:28 +00:00
2016-09-24 23:59:30 +00:00
Returns `NativeImage`
2019-03-14 18:00:38 +00:00
Creates a new `NativeImage` instance from `buffer` . Tries to decode as PNG or JPEG first.
2015-02-12 05:52:28 +00:00
2015-11-13 08:03:40 +00:00
### `nativeImage.createFromDataURL(dataURL)`
2015-02-12 05:52:28 +00:00
2021-11-16 04:13:18 +00:00
* `dataURL` string
2015-02-12 05:52:28 +00:00
2017-05-15 15:24:06 +00:00
Returns `NativeImage`
2024-03-12 16:33:56 +00:00
Creates a new `NativeImage` instance from `dataUrl` , a base 64 encoded [Data URL][data-url] string.
2016-07-22 20:42:27 +00:00
2017-10-10 06:05:13 +00:00
### `nativeImage.createFromNamedImage(imageName[, hslShift])` _macOS_
2017-10-09 16:16:24 +00:00
2021-11-16 04:13:18 +00:00
* `imageName` string
* `hslShift` number[] (optional)
2017-10-09 16:16:24 +00:00
Returns `NativeImage`
2024-03-12 16:33:56 +00:00
Creates a new `NativeImage` instance from the `NSImage` that maps to the
given image name. See Apple's [`NSImageName` ](https://developer.apple.com/documentation/appkit/nsimagename#2901388 )
documentation for a list of possible values.
2017-10-09 16:16:24 +00:00
2019-08-19 22:15:13 +00:00
The `hslShift` is applied to the image with the following rules:
2017-10-10 06:05:13 +00:00
* `hsl_shift[0]` (hue): The absolute hue value for the image - 0 and 1 map
2024-03-12 16:33:56 +00:00
to 0 and 360 on the hue color wheel (red).
2017-10-10 06:05:13 +00:00
* `hsl_shift[1]` (saturation): A saturation shift for the image, with the
2017-11-29 10:58:24 +00:00
following key values:
0 = remove all color.
0.5 = leave unchanged.
1 = fully saturate the image.
2017-10-10 06:05:13 +00:00
* `hsl_shift[2]` (lightness): A lightness shift for the image, with the
2017-11-29 10:58:24 +00:00
following key values:
0 = remove all lightness (make all pixels black).
0.5 = leave unchanged.
2017-10-10 06:05:13 +00:00
1 = full lightness (make all pixels white).
This means that `[-1, 0, 1]` will make the image completely white and
`[-1, 1, 0]` will make the image completely black.
2019-04-17 22:06:51 +00:00
In some cases, the `NSImageName` doesn't match its string representation; one example of this is `NSFolderImageName` , whose string representation would actually be `NSFolder` . Therefore, you'll need to determine the correct string representation for your image before passing it in. This can be done with the following:
2024-03-12 16:33:56 +00:00
```sh
echo -e '#import < Cocoa / Cocoa . h > \nint main() { NSLog(@"%@", SYSTEM_IMAGE_NAME); }' | clang -otest -x objective-c -framework Cocoa - && ./test
```
2019-04-17 22:06:51 +00:00
where `SYSTEM_IMAGE_NAME` should be replaced with any value from [this list ](https://developer.apple.com/documentation/appkit/nsimagename?language=objc ).
2016-07-22 20:42:27 +00:00
## Class: NativeImage
2016-08-22 21:11:03 +00:00
> Natively wrap images such as tray, dock, and application icons.
2015-02-12 05:52:28 +00:00
2021-06-15 20:50:31 +00:00
Process: [Main ](../glossary.md#main-process ), [Renderer ](../glossary.md#renderer-process )< br />
_This class is not exported from the `'electron'` module. It is only available as a return value of other methods in the Electron API._
2016-11-03 18:50:00 +00:00
2016-07-22 20:42:27 +00:00
### Instance Methods
2015-08-29 04:33:45 +00:00
2016-07-22 20:42:27 +00:00
The following methods are available on instances of the `NativeImage` class:
2015-02-12 05:52:28 +00:00
2017-03-07 00:22:48 +00:00
#### `image.toPNG([options])`
* `options` Object (optional)
2022-07-26 07:57:01 +00:00
* `scaleFactor` Number (optional) - Defaults to 1.0.
2015-02-12 05:52:28 +00:00
2016-09-24 23:59:30 +00:00
Returns `Buffer` - A [Buffer][buffer] that contains the image's `PNG` encoded data.
2015-02-12 05:52:28 +00:00
2016-07-22 20:42:27 +00:00
#### `image.toJPEG(quality)`
2015-02-12 07:38:16 +00:00
2019-05-06 15:29:01 +00:00
* `quality` Integer - Between 0 - 100.
2015-02-12 05:52:28 +00:00
2016-09-24 23:59:30 +00:00
Returns `Buffer` - A [Buffer][buffer] that contains the image's `JPEG` encoded data.
2015-02-12 05:52:28 +00:00
2017-03-07 00:22:48 +00:00
#### `image.toBitmap([options])`
* `options` Object (optional)
2022-07-26 07:57:01 +00:00
* `scaleFactor` Number (optional) - Defaults to 1.0.
2016-08-01 00:14:45 +00:00
2016-09-24 23:59:30 +00:00
Returns `Buffer` - A [Buffer][buffer] that contains a copy of the image's raw bitmap pixel
2016-08-05 08:55:57 +00:00
data.
2016-08-01 00:14:45 +00:00
2017-03-07 00:22:48 +00:00
#### `image.toDataURL([options])`
2024-08-19 18:17:10 +00:00
<!--
```YAML history
changes:
- pr-url: https://github.com/electron/electron/pull/41752
description: "`nativeImage.toDataURL` will preserve PNG colorspace"
breaking-changes-header: behavior-changed-nativeimagetodataurl-will-preserve-png-colorspace
```
-->
2017-03-07 00:22:48 +00:00
* `options` Object (optional)
2022-07-26 07:57:01 +00:00
* `scaleFactor` Number (optional) - Defaults to 1.0.
2015-02-12 07:38:16 +00:00
2024-03-12 16:33:56 +00:00
Returns `string` - The [Data URL][data-url] of the image.
2015-02-12 07:38:16 +00:00
2017-03-07 00:22:48 +00:00
#### `image.getBitmap([options])`
* `options` Object (optional)
2022-07-26 07:57:01 +00:00
* `scaleFactor` Number (optional) - Defaults to 1.0.
2016-08-04 17:45:06 +00:00
2016-09-24 23:59:30 +00:00
Returns `Buffer` - A [Buffer][buffer] that contains the image's raw bitmap pixel data.
2016-08-05 08:55:57 +00:00
2019-08-19 22:15:13 +00:00
The difference between `getBitmap()` and `toBitmap()` is that `getBitmap()` does not
2016-08-05 08:55:57 +00:00
copy the bitmap data, so you have to use the returned Buffer immediately in
2019-08-19 22:15:13 +00:00
current event loop tick; otherwise the data might be changed or destroyed.
2016-08-04 17:45:06 +00:00
2016-07-22 20:42:27 +00:00
#### `image.getNativeHandle()` _macOS_
2016-03-14 03:11:43 +00:00
2016-09-24 23:59:30 +00:00
Returns `Buffer` - A [Buffer][buffer] that stores C pointer to underlying native handle of
2024-03-12 16:33:56 +00:00
the image. On macOS, a pointer to `NSImage` instance is returned.
2016-03-14 03:11:43 +00:00
2016-03-17 12:55:02 +00:00
Notice that the returned pointer is a weak pointer to the underlying native
image instead of a copy, so you _must_ ensure that the associated
`nativeImage` instance is kept around.
2016-03-14 03:11:43 +00:00
2016-07-22 20:42:27 +00:00
#### `image.isEmpty()`
2015-02-12 05:52:28 +00:00
2021-11-16 04:13:18 +00:00
Returns `boolean` - Whether the image is empty.
2015-02-12 05:52:28 +00:00
2020-05-21 01:52:48 +00:00
#### `image.getSize([scaleFactor])`
2015-02-12 05:52:28 +00:00
2022-07-26 07:57:01 +00:00
* `scaleFactor` Number (optional) - Defaults to 1.0.
2020-05-21 01:52:48 +00:00
Returns [`Size` ](structures/size.md ).
If `scaleFactor` is passed, this will return the size corresponding to the image representation most closely matching the passed value.
2015-04-08 08:20:03 +00:00
2016-07-22 20:42:27 +00:00
#### `image.setTemplateImage(option)`
2015-04-08 08:20:03 +00:00
2021-11-16 04:13:18 +00:00
* `option` boolean
2015-04-08 08:20:03 +00:00
2024-03-12 16:33:56 +00:00
Marks the image as a macOS [template image][template-image].
2015-07-29 03:48:40 +00:00
2016-07-22 20:42:27 +00:00
#### `image.isTemplateImage()`
2015-07-29 03:48:40 +00:00
2024-03-12 16:33:56 +00:00
Returns `boolean` - Whether the image is a macOS [template image][template-image].
2016-10-04 20:34:24 +00:00
2016-10-05 15:02:04 +00:00
#### `image.crop(rect)`
2016-10-04 18:42:14 +00:00
2017-11-29 10:38:35 +00:00
* `rect` [Rectangle ](structures/rectangle.md ) - The area of the image to crop.
2016-10-04 18:42:14 +00:00
Returns `NativeImage` - The cropped image.
#### `image.resize(options)`
* `options` Object
2017-03-09 18:12:03 +00:00
* `width` Integer (optional) - Defaults to the image's width.
2017-11-29 10:38:35 +00:00
* `height` Integer (optional) - Defaults to the image's height.
2021-11-16 04:13:18 +00:00
* `quality` string (optional) - The desired quality of the resize image.
2023-07-31 08:32:59 +00:00
Possible values include `good` , `better` , or `best` . The default is `best` .
2016-10-04 18:42:14 +00:00
These values express a desired quality/speed tradeoff. They are translated
into an algorithm-specific method that depends on the capabilities
(CPU, GPU) of the underlying platform. It is possible for all three methods
to be mapped to the same algorithm on a given platform.
Returns `NativeImage` - The resized image.
2016-10-05 16:15:06 +00:00
If only the `height` or the `width` are specified then the current aspect ratio
will be preserved in the resized image.
2020-05-21 01:52:48 +00:00
#### `image.getAspectRatio([scaleFactor])`
2022-07-26 07:57:01 +00:00
* `scaleFactor` Number (optional) - Defaults to 1.0.
2016-10-05 16:15:06 +00:00
2024-03-12 16:33:56 +00:00
Returns `Number` - The image's aspect ratio (width divided by height).
2016-10-05 16:15:06 +00:00
2020-05-21 01:52:48 +00:00
If `scaleFactor` is passed, this will return the aspect ratio corresponding to the image representation most closely matching the passed value.
#### `image.getScaleFactors()`
2024-03-12 16:33:56 +00:00
Returns `Number[]` - An array of all scale factors corresponding to representations for a given `NativeImage` .
2020-05-21 01:52:48 +00:00
2017-03-07 22:29:37 +00:00
#### `image.addRepresentation(options)`
* `options` Object
2022-07-26 07:57:01 +00:00
* `scaleFactor` Number (optional) - The scale factor to add the image representation for.
2017-03-09 18:12:03 +00:00
* `width` Integer (optional) - Defaults to 0. Required if a bitmap buffer
is specified as `buffer` .
* `height` Integer (optional) - Defaults to 0. Required if a bitmap buffer
is specified as `buffer` .
2017-03-07 22:29:37 +00:00
* `buffer` Buffer (optional) - The buffer containing the raw image data.
2021-11-16 04:13:18 +00:00
* `dataURL` string (optional) - The data URL containing either a base 64
2017-03-07 22:29:37 +00:00
encoded PNG or JPEG image.
Add an image representation for a specific scale factor. This can be used
2024-03-12 16:33:56 +00:00
to programmatically add different scale factor representations to an image. This
2017-03-07 22:29:37 +00:00
can be called on empty images.
2019-11-18 18:57:22 +00:00
### Instance Properties
2019-05-07 13:52:07 +00:00
2019-11-18 18:57:22 +00:00
#### `nativeImage.isMacTemplateImage` _macOS_
2019-05-07 13:52:07 +00:00
2024-03-12 16:33:56 +00:00
A `boolean` property that determines whether the image is considered a [template image][template-image].
2019-05-07 13:52:07 +00:00
Please note that this property only has an effect on macOS.
2024-03-12 16:33:56 +00:00
[buffer]: https://nodejs.org/api/buffer.html#buffer_class_buffer
[data-url]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URLs
[template-image]: https://developer.apple.com/documentation/appkit/nsimage/1520017-template