React Nativeで画像のRGBA値が欲しくて調べてたらreact-native-image-tools
というライブラリを見つけました。
かなり名前が近い別パッケージもあるので混同注意です。
% npm -i react-native-image-tool
% react-native link react-native-image-tool
で導入できます。
インターフェースはざっくり
createBinaryImage
GetImageRGBAs
な2つしかないようです。このうち、GetImageRGBAs
のほうを使いました。
画像のURLを渡すと結果が返ってくるという形です。結果には、width
、height
、およびrgba
というRGBAの配列が返ってきます。
以下は、この画像を読み込んでみる例です。
https://imgur.com/download/OSEiha9
import ImageTools from 'react-native-image-tool';
const url = 'https://imgur.com/download/OSEiha9';
ImageTools.GetImageRGBAs(url)
.then(response => {
// response.rgba
});
さてこのRGBAの配列ですが、32bitの符号付き整数として返ってきます。
response.rgba[0]
// => -16776961
例えば0番目には-16776961
という値が入っています。これを符号無しにしてビット演算でRGBA毎の値に変換してあげないといけません。
(そのまま一気に行けそうな気もするけど個人的にわかりにくいから、符号なしにしてから各成分を取り出してます)
以下の関数を定義して、-16776961
を変換してみます。
unsigned(signedValue) {
return signedValue >>> 0;
}
red(unsignedValue) {
return (unsignedValue >> 0) & 0xff;
}
green(unsignedValue) {
return (unsignedValue >> 8) & 0xff;
}
blue(unsignedValue) {
return (unsignedValue >> 16) & 0xff;
}
alpha(unsignedValue) {
return (unsignedValue >> 24) & 0xff;
}
const val = response.rgba[0];
const u = unsigned(val);
// => 4278190335
const r = red(u);
// => 255
const g = green(u);
// => 0
const g = blue(u);
// => 0
const a = alpha(u);
// => 255
という感じでR
とA
が255
、G
とB
が0
だということがわかりました。0番目は画像の左上で赤が正しいので、結果も合っていそうです。
response.rgba
は配列なので、mapなどを使えば一気に赤成分だけ取り出すことも可能です。
const redArray = response.rgba.map(value => {
const uint = unsigned(value);
return red(uint);
});