javascript - 从 laravel api 中的 react-native 应用程序调整 base64 图像的大小?
问题描述
我正在尝试开发一个应用程序,该应用程序可以从他们的设备相机以 base64 格式发送用户图像输入,并让我的 api 处理、调整大小并以 jpg 格式保存图像,我将react-native image-picker
其用作相机处理程序。到目前为止,这是我的代码
// in imageHandlerController.php
public function resizeImage($image) {
$resizeImage = Image::make($images)->resize(512, 512, function($constraint) {
$constraint->aspectRatio();
})->orientate();
return $resizeImage->response();
}
public function imageHandler(Request $request){
DB::beginTransaction();
try {
$constants = Config::get('constants');
$path = $constants['UPLOAD_PATH'].'/images';
$random_name = str_random(20);
$selfie = $request->selfieImage;
$selfie = str_replace('data:image/png;base64,', '', $selfie);
$selfie = str_replace(' ', '+', $selfie);
$selfie_name = 'selfie-'.$random_name.'.png';
File::put($path.'/partners/'.$selfie_name, $this->resizeImage($selfie));
}
这是 index.js 上的发布请求
launchCameraSelfie = () => {
ImagePicker.showImagePicker(response => {
if (response.didCancel) {
console.log('User cancelled image picker');
} else if (response.error) {
console.log('ImagePicker Error: ', response.error);
} else {
let source = response;
this.setState({
selfieImage: source.data
});
}
});
};
它显示Unable to init from binary data
为错误我该怎么做?任何帮助将不胜感激...
解决方案
看起来您正在使用该Intervention Image
软件包。文档显示确实可以将 base64 字符串转换为Image
.
我不清楚为什么data:image/png;base64,
要从编码图像中删除初始字符串。我可以想象这部分对于干预起作用是必要的。
我缩短并重写了您的代码。这对我有用:
use Intervention\Image\ImageManagerStatic as Image;
$selfie = $request->selfieImage;
$img = Image::make($selfie);
$img->resize(512, 512, function($constraint) {
$constraint->aspectRatio();
})->orientate();
$img->save(storage_path('images') . '/test.png');
为了方便测试,可以使用以下 base64 图像(它表示单个黑色像素):
$selfie = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk+A8AAQUBAScY42YAAAAASUVORK5CYII=';
如果你想做一些深入的调试,看看 Intervention 的AbstractDecoder
类和它的init()
功能。它是识别图像类型的地方,由于某种原因,您的图像被识别为二进制。
推荐阅读
- reactjs - 如何在 Jest 中模拟变量?
- javascript - 仅激活列表中的 2 个项目
- vue.js - Vuex 没有反应
- java - 使用 POI 查找特定列中的行数
- spring-integration - JtaTransaction 与 Jdbc XA 和 Jms
- flutter - 如何知道参数是否传递给泛型类的(默认 arg)函数?
- rest - 如何根据命名标准命名地址验证 api
- c - 链接列表 - 什么会导致使用 malloc 分配的地址实际上从未被分配?
- javascript - JS 不能在 atom 编辑器中工作,但 CSS 可以
- php - 在 PHP 中使用 PDO 从多个表中搜索的更好方法是什么?