Swift 3 (это не расширение UIImage, мне оно нужно в другом классе), это может сэкономить время для кого-то:
class EditImage {
static func cropRect(_ image: UIImage) -> CGRect {
let cgImage = image.cgImage
let context = createARGBBitmapContextFromImage(inImage: cgImage!)
if context == nil {
return CGRect.zero
}
let height = CGFloat(cgImage!.height)
let width = CGFloat(cgImage!.width)
let rect = CGRect(x: 0, y: 0, width: width, height: height)
context?.draw(cgImage!, in: rect)
//let data = UnsafePointer<CUnsignedChar>(CGBitmapContextGetData(context))
let data = context?.data?.assumingMemoryBound(to: UInt8.self)
if data == nil {
return CGRect.zero
}
var lowX = width
var lowY = height
var highX: CGFloat = 0
var highY: CGFloat = 0
let heightInt = Int(height)
let widthInt = Int(width)
//Filter through data and look for non-transparent pixels.
for y in (0 ..< heightInt) {
let y = CGFloat(y)
for x in (0 ..< widthInt) {
let x = CGFloat(x)
let pixelIndex = (width * y + x) * 4 /* 4 for A, R, G, B */
if data?[Int(pixelIndex)] != 0 { //Alpha value is not zero pixel is not transparent.
if (x < lowX) {
lowX = x
}
if (x > highX) {
highX = x
}
if (y < lowY) {
lowY = y
}
if (y > highY) {
highY = y
}
}
}
}
return CGRect(x: lowX, y: lowY, width: highX - lowY, height: highY - lowY)
}
static func createARGBBitmapContextFromImage(inImage: CGImage) -> CGContext? {
let width = inImage.width
let height = inImage.height
let bitmapBytesPerRow = width * 4
let bitmapByteCount = bitmapBytesPerRow * height
let colorSpace = CGColorSpaceCreateDeviceRGB()
if colorSpace == nil {
return nil
}
let bitmapData = malloc(bitmapByteCount)
if bitmapData == nil {
return nil
}
let context = CGContext (data: bitmapData,
width: width,
height: height,
bitsPerComponent: 8, // bits per component
bytesPerRow: bitmapBytesPerRow,
space: colorSpace,
bitmapInfo: CGImageAlphaInfo.premultipliedFirst.rawValue)
return context
}
}
У меня есть несколько проектов, которые делают то, что вы только что сказали, сохраняя записи в нескольких таблицах одновременно. Я считаю, что это действительно происходит в приложении в реальном сценарии.
Вот что я делаю, хотя:
public function store(Request $request)
{
$main = $this->saveModel1($request);
$this->saveModel2($request);
return redirect()->route('my.route.name.for.edit', $main->id);
}
private function saveModel1($request)
{
$model1 = new Model1;
$model1->bla = "Model1";
$model1->save();
return $model1->id;
}
private function saveModel2($request)
{
$model2 = new Model2;
$model2->bla = "Model2";
$model2->save();
}
ОБНОВЛЕНИЕ: Этот ответ был выбран как правильный, но я просто хочу добавить, что при таких условиях, это безопасно, чтобы включить ваш запрос сохранения в транзакция.
DB::beginTransaction();
try
{
}
catch (\PDOException $e)
{
}