如何在 iPhone 中裁剪图像

2023-12-01

我想做同样的事情this问题。 在我的应用程序中,我想像在 Facebook 中进行图像裁剪一样裁剪图像,任何人都可以通过优秀教程的链接或任何示例代码来指导我。我提供的链接将完整描述我的要求。


您可以创建具有任何属性的新图像。这是我的功能,女巫执行此操作。您只需要使用自己的新图像参数即可。就我而言,图像没有被裁剪,我只是做了一些效果,将像素从原始位置移动到另一个位置。但是,如果您使用另一个高度和宽度初始化新图像,则可以将所需的旧图像的任何像素范围复制到新图像:

-(UIImage *)Color:(UIImage *)img
{
    int R;
    float m_width = img.size.width;
    float m_height = img.size.height;
    if (m_width>m_height) R = m_height*0.9;
    else R = m_width*0.9;
    int m_wint = (int)m_width;      //later,  we will need this parameters in float and int. you may just use "(int)" and "(float)" before variables later, and do not implement another ones
    int m_hint = (int)m_height;

    CGRect imageRect;
    //cheking image orientation. we will work with image pixel-by-pixel, so we need to make top side at the top.
    if(img.imageOrientation==UIImageOrientationUp 
       || img.imageOrientation==UIImageOrientationDown) 
    {
        imageRect = CGRectMake(0, 0, m_wint, m_hint); 
    }
    else 
    {
        imageRect = CGRectMake(0, 0, m_hint, m_wint); 
    }
    uint32_t *rgbImage = (uint32_t *) malloc(m_wint * m_hint * sizeof(uint32_t));
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = CGBitmapContextCreate(rgbImage, m_wint, m_hint, 8, m_wint *sizeof(uint32_t), colorSpace,   kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipLast);
    CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
    CGContextSetShouldAntialias(context, NO);
    CGContextTranslateCTM(context, 0, m_hint);
    CGContextScaleCTM(context, 1.0, -1.0);
    switch (img.imageOrientation) {
        case UIImageOrientationRight:
        {
            CGContextRotateCTM(context, M_PI / 2);
            CGContextTranslateCTM(context, 0, -m_wint);            
        }break;
        case UIImageOrientationLeft:
        {
            CGContextRotateCTM(context, - M_PI / 2);
            CGContextTranslateCTM(context, -m_hint, 0);            
        }break;
        case UIImageOrientationUp:
        {
            CGContextTranslateCTM(context, m_wint, m_hint);
            CGContextRotateCTM(context, M_PI);
        }
        default:
            break;
    }

    CGContextDrawImage(context, imageRect, img.CGImage);
    CGContextRelease(context);
    CGColorSpaceRelease(colorSpace);

    //here is new image. you can change m_wint and m_hint as you whant
    uint8_t *result = (uint8_t *) calloc(m_wint * m_hint * sizeof(uint32_t), 1);
    for(int y = 0; y < m_hint; y++) //new m_hint here
    {
        float fy=y;
        double yy =    (m_height*(  asinf(m_height/(2*R))-asin(((m_height/2)-fy)/R)   )) /
        (2*asin(m_height/(2*R))); // (xx, yy) - coordinates of pixel of OLD image
        for(int x =  0; x < m_wint; x++) //new m_wint here
        {
            float fx=x;
            double xx =    (m_width*(  asin(m_width/(2*R))-asin(((m_width/2)-fx)/R)   )) /
            (2*asin(m_width/(2*R)));
            uint32_t rgbPixel=rgbImage[(int)yy * m_wint + (int)xx];
            int intRedSource = (rgbPixel>>24)&255;
            int intGreenSource = (rgbPixel>>16)&255;
            int intBlueSource = (rgbPixel>>8)&255;
            result[(y * (int)m_wint + x) * 4] = 0;
            result[(y * (int)m_wint + x) * 4 + 1] = intBlueSource;
            result[(y * (int)m_wint + x) * 4 + 2] = intGreenSource;
            result[(y * (int)m_wint + x) * 4 + 3] = intRedSource;

        }
    }

    free(rgbImage);

    colorSpace = CGColorSpaceCreateDeviceRGB();
    context = CGBitmapContextCreate(result, m_wint, m_hint, 8, m_wint * sizeof(uint32_t), colorSpace,   kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipLast  ); //new m_wint and m_hint as well


    CGImageRef image1 = CGBitmapContextCreateImage(context);
    CGContextRelease(context);
    CGColorSpaceRelease(colorSpace);
    UIImage *resultUIImage = [UIImage imageWithCGImage:image1];
    CGImageRelease(image1);


    @try {
        free(result);
    }
    @catch (NSException * e) {
        NSLog(@"proc. Exception: %@", e);
    }

    return resultUIImage;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 iPhone 中裁剪图像 的相关文章

随机推荐

  • 检索文件的全名,按日期过滤

    date datetime 05 19 2014 gci Recurse Select Object FullName LastWriteTime Where Object LastWriteTime ToShortDateString g
  • mod_security:允许没有请求正文的 POST 请求的规则

    我安装了 Apache 2 4 和 mod security 2 9 1 它正在工作 有一些非常基本的规则 我正在尝试发出一个包含一些标头信息的 POST 请求 但请求正文中没有任何内容 该请求是发送给受 mod security 保护的
  • subscribe 的作用是什么?它与 Observable 有何关系?

    我是 Angular 的新手 我遵循的教程有术语 Observable 导师解释了 但我没有完全理解 什么是Observable 以及为什么我们总是要打电话observable subscribe 什么是subscribe 实际上呢 什么是
  • 使用 .NET“异步”API 防止 TIME_WAIT

    我有一个问题 我开发了一个客户端和服务器包装器供我个人使用 但不幸的是由于网络编程知识不足 我在客户端连接期间遇到了 TIME WAIT 问题 我的客户端现在尝试在短时间内与同一主机建立多个连接 我发现其主要原因是因为我试图重用套接字 并且
  • NASM 引导加载程序中的 jmp $

    我试图编写引导加载程序引导装载程序 写的代码是 BITS 16 start mov ax 07C0h Set up 4K stack space after this bootloader add ax 288 4096 512 16 by
  • 在 ASP.NET 应用程序中实现多语言的最佳方式

    多语言应用程序中预计会发生以下事情 行为 为登录用户的语言选择正确的资源 字符串排序应根据用户语言进行 例如 对于瑞典用户 瑞典字母应按顺序排在 z 之后 日期时间格式验证应根据用户的语言进行 例如 fr FR 用户可以输入 dd mm y
  • 有没有办法将数组传递给 python 泛型?

    我正在做一些元编程 我需要一种方法来动态定义类型提示 有没有办法将参数数组传递给类型提示 就像是 Some programatically generated list where I don t know the content unti
  • 函数指针、闭包和 Lambda

    我现在刚刚学习函数指针 当我阅读有关该主题的 K R 章节时 我首先想到的是 嘿 这有点像闭包 我知道这个假设在某种程度上从根本上是错误的 在网上搜索后我没有找到任何对此比较的分析 那么为什么 C 风格的函数指针与闭包或 lambda 有根
  • 为什么“gem”和“sudo gem”有不同的安装目录?

    我记得我用过gem install rails安装 Rails 但今天当我想安装另一个 gem 时 输入 gem install ruby recaptcha 它失败了 说 您没有写入权限 然后我找到了我的gem environment a
  • Angularjs 中的克隆元素

    我需要复制一些输入字段才能处理来自客户端的数据 我已经用 jQuery 完成了http jsfiddle net m7R3f 1 HTML fieldset div class pure g entry div class pure u 1
  • 函数中的中断和继续

    def funcA i if i 3 0 print Oh No print i break for i in range 100 funcA i print Pass print i 我知道上面的脚本行不通 那么 如果我需要将带有brea
  • Javascript window.open() 函数打开链接而不使用弹出窗口拦截器

    JavaScriptwindow open 函数打开链接而不使用弹出窗口拦截器 我想从 javascript 打开一些链接window open 功能 但在 firefox chrome safari 上被阻止 如何通过 javascrip
  • 非英语语言的推送通知

    我已经成功实现了这段代码 有谁知道如何用 C 编写 Apple 推送通知提供程序 效果很好 但我有一个问题 有人可以帮助我如何发送希伯来语或阿拉伯语等非英语消息吗 如果字符串包含任何非英文字符 则不会发送 谢谢 我找到了解决方案 长度错了
  • 在 Python 中使用 urlopen() 防止“隐藏”重定向

    我在用美丽汤对于网页抓取 我在使用时遇到特定类型网站的问题urlopen 网站上的每个项目都有自己独特的页面 并且项目有不同的格式 例如 500 毫升 1 升 2 升 当我打开产品的 URL 时 www example com produc
  • 无法使用 fetchkml 函数将本地 KMZ 文件加载到具有 google Earth 插件的浏览器中

    我们有一个 KMZ 文件 可以很好地加载到 Google 地球桌面应用程序中 没有错误 当我们尝试使用 Google Earth 插件来做同样的事情时 它甚至不会从fetchKml功能 我们需要了解使用的任何特殊设置fetchKml在本地文
  • 如何使用 Qt 创建暂停/等待函数?

    我正在玩Qt 我想在两个命令之间创建一个简单的暂停 但它似乎不会让我使用Sleep int mili 而且我找不到任何明显的等待函数 我基本上只是制作一个控制台应用程序来测试一些类代码 这些代码稍后将包含在适当的 Qt GUI 中 所以现在
  • 编译器为内在函数生成的程序集的问题

    我正在使用英特尔 SSE AVX FMA 内在函数来实现某些数学函数的完美内联 SSE AVX 指令 给出以下代码 include
  • 在 BLE 中随机化 Mac 地址

    我制作了一款将 iOS 设备变成信标的应用程序 现在 当我从 Android 设备扫描 BLE 设备时 我在扫描列表中找到了该 iOS 设备 但问题是每次我都得到随机的 Mac 地址 所以 我的问题是 这种默认行为是否意味着获取随机 mac
  • pine 脚本中 := 和 = 运算符之间的区别

    我对 TradingView Pine 脚本非常陌生 我没有找到合适的参考来理解两者之间的区别 and 运营商 有人有参考或描述吗 提前致谢 用于声明和初始化变量 用于在初始化后为变量赋值 将其转换为 可变变量 任何不可变变量 follow
  • 如何在 iPhone 中裁剪图像

    我想做同样的事情this问题 在我的应用程序中 我想像在 Facebook 中进行图像裁剪一样裁剪图像 任何人都可以通过优秀教程的链接或任何示例代码来指导我 我提供的链接将完整描述我的要求 您可以创建具有任何属性的新图像 这是我的功能 女巫