最近做个小游戏需要调用手机图库和摄像头并裁减图片,发现网上很多教程不是太全,有的安卓端裁减不了大图,下面是完整代码,可以裁减高清图的。
完整拼图游戏下载:
https://github.com/sky068/Puzzles
1、首先是跨平台入口代码,iOS平台需要把ImageCrop.cpp改成ImageCrop.mm,并且在AppController.mm里调用setViewController(void* viewController)把rootView传进来初始化m_viewController
#ifndef ImageCrop_hpp
#define ImageCrop_hpp
#include <stdio.h>
#include "cocos2d.h"
USING_NS_CC;
#define kImageCropEvent "ImageCropEvent"
class ImageCrop
{
public:
ImageCrop();
static ImageCrop* getInstance();
static void destroyInstance();
void openCamera(std::function<void(std::string)> callback);
void openPhoto(std::function<void(std::string)> callback);
#if ( CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
//设置AppController iOS平台在AppController.mm里调用把rootViewController传递过来
void setViewController(void* viewController);
void *m_viewController;
#endif
private:
static ImageCrop* _instance;
std::function<void(std::string)> _callback;
};
#endif
//
// ImageCrop.cpp
// PhotoCrop
//
// Created by xujw on 15/12/28.
//
//
#include "ImageCrop.hpp"
#if ( CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
#import "ImagePickerViewController.h"
#import "RootViewController.h"
#endif
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include "platform/android/jni/JniHelper.h"
#include <jni.h>
#define JAVA_CLASS "org/cocos2dx/cpp/ImageCrop"
#define JAVA_FUNC_OPEN_PHOTO "openPhoto"
#define JAVA_FUNC_OPEN_CAMERA "openCamera"
#endif
ImageCrop::ImageCrop()
:_callback(nullptr)
{
Director::getInstance()->getEventDispatcher()->addCustomEventListener(kImageCropEvent, [=](EventCustom *event)
{
std::string *imgPath = (std::string*)event->getUserData();
_callback(*imgPath);
});
}
ImageCrop* ImageCrop::_instance = nullptr;
ImageCrop* ImageCrop::getInstance()
{
if (!_instance)
{
_instance = new (std::nothrow) ImageCrop();
}
return _instance;
}
void ImageCrop::destroyInstance()
{
CC_SAFE_DELETE(_instance);
}
void ImageCrop::openCamera(std::function<void (std::string)> callback)
{
_callback = callback;
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
ImagePickerViewController * imagePickerViewController = [[ImagePickerViewController alloc]initWithNibName:nil bundle:nil];
RootViewController *_viewController = (RootViewController*)m_viewController;
[_viewController.view addSubview:imagePickerViewController.view];
[imagePickerViewController takePhoto];
#endif
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
JniMethodInfo info;
bool ret = JniHelper::getStaticMethodInfo(info,JAVA_CLASS,JAVA_FUNC_OPEN_CAMERA,"()V");
if (ret)
{
info.env->CallStaticVoidMethod(info.classID,info.methodID);
}
#endif
}
void ImageCrop::openPhoto(std::function<void (std::string)> callback)
{
_callback = callback;
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
ImagePickerViewController * imagePickerViewController = [[ImagePickerViewController alloc]initWithNibName:nil bundle:nil];
RootViewController *_viewController = (RootViewController*)m_viewController;
[_viewController.view addSubview:imagePickerViewController.view];
[imagePickerViewController localPhoto];
#endif
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
JniMethodInfo info;
bool ret = JniHelper::getStaticMethodInfo(info,JAVA_CLASS,JAVA_FUNC_OPEN_PHOTO,"()V");
if (ret)
{
info.env->CallStaticVoidMethod(info.classID,info.methodID);
}
#endif
}
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
void ImageCrop::setViewController(void *viewController)
{
m_viewController = viewController;
}
#endif
//--------Java回调C++--------native 方法
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
extern "C"
{
void