ইউআইআইমেজ: পুনরায় আকার দিন, তারপরে ক্রপ করুন


187

আমি এখন আক্ষরিক দিনগুলির জন্য এইটিতে আমার মুখের উপর চাপ দিচ্ছি এবং যদিও আমি ক্রমাগত অনুভব করি যে আমি প্রত্যাদেশের ধারায় আছি, আমি কেবল আমার লক্ষ্য অর্জন করতে পারি না।

আমি ভেবেছিলাম, আমার নকশার ধারণাগত পর্যায়ক্রমে, আমি আইফোনটির ক্যামেরা বা লাইব্রেরি থেকে কোনও চিত্র দখল করা, এটি একটি নির্দিষ্ট উচ্চতায় স্কেল করা, এপেক্ট ফিল পূরণ বিকল্পটির সমতুল্য একটি কার্যকারিতা ব্যবহার করা তুচ্ছ বিষয় হবে thought UIImageView (সম্পূর্ণরূপে কোডে), এবং তারপর বন্ধ ক্রপ কিছু যে একটি পাস CGRect মধ্যে মাপসই করা হয়নি।

ক্যামেরা বা লাইব্রেরি থেকে আসল চিত্র পাওয়া তুচ্ছ ছিল। অন্যান্য দুটি পদক্ষেপ কতটা প্রমাণিত হয়েছে তা দেখে আমি হতবাক।

সংযুক্ত চিত্রটি দেখায় আমি কী অর্জন করতে চাইছি। কেউ দয়া করে আমার হাত ধরে যথেষ্ট দয়াবান হতে পারেন? আমি এখনও অবধি খুঁজে পাওয়া প্রতিটি কোড উদাহরণটি মনে হয় যে চিত্রটি টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো বা অন্যথায় ঠিক সঠিকভাবে কাজ করা নয়।


7
লিঙ্কটি আপনার ছবিতে নষ্ট হয়ে গেছে।

1
আমরা যদি হতবাক হয়ে যাই তবে একটি বিষয় হ'ল অ্যাপল কেন এটি ইউআইজিগেশন পিকারকন্ট্রোলারে যুক্ত করেনি - এটি খুব ভয়ঙ্কর কঠিন ;-)
টিম

উত্তর:


246

আমার একই জিনিসটির প্রয়োজন ছিল - আমার ক্ষেত্রে, একবারে স্কেল করা যায় এমন মাত্রা বাছাই করতে এবং তারপরে বাকি প্রস্থের সাথে ফিট করার জন্য প্রতিটি প্রান্তটি ক্রপ করুন। (আমি ল্যান্ডস্কেপে কাজ করছি, সুতরাং প্রতিকৃতি মোডে কোনও ঘাটতি লক্ষ্য করা যায় না)) এখানে আমার কোডটি - এটি ইউআইআইমেজে একটি ক্যাটেজরির অংশ। আমার কোডে লক্ষ্য আকারটি সর্বদা ডিভাইসের পূর্ণ স্ক্রিন আকারে সেট করা থাকে।

@implementation UIImage (Extras)

#pragma mark -
#pragma mark Scale and crop image

- (UIImage*)imageByScalingAndCroppingForSize:(CGSize)targetSize
{
    UIImage *sourceImage = self;
    UIImage *newImage = nil;    
    CGSize imageSize = sourceImage.size;
    CGFloat width = imageSize.width;
    CGFloat height = imageSize.height;
    CGFloat targetWidth = targetSize.width;
    CGFloat targetHeight = targetSize.height;
    CGFloat scaleFactor = 0.0;
    CGFloat scaledWidth = targetWidth;
    CGFloat scaledHeight = targetHeight;
    CGPoint thumbnailPoint = CGPointMake(0.0,0.0);

    if (CGSizeEqualToSize(imageSize, targetSize) == NO) 
    {
        CGFloat widthFactor = targetWidth / width;
        CGFloat heightFactor = targetHeight / height;

        if (widthFactor > heightFactor) 
        {
            scaleFactor = widthFactor; // scale to fit height
        }
        else
        {
            scaleFactor = heightFactor; // scale to fit width
        }

        scaledWidth  = width * scaleFactor;
        scaledHeight = height * scaleFactor;

        // center the image
        if (widthFactor > heightFactor)
        {
            thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5; 
        }
        else
        {
            if (widthFactor < heightFactor)
            {
                thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5;
            }
        }
    }   

    UIGraphicsBeginImageContext(targetSize); // this will crop

    CGRect thumbnailRect = CGRectZero;
    thumbnailRect.origin = thumbnailPoint;
    thumbnailRect.size.width  = scaledWidth;
    thumbnailRect.size.height = scaledHeight;

    [sourceImage drawInRect:thumbnailRect];

    newImage = UIGraphicsGetImageFromCurrentImageContext();

    if(newImage == nil)
    {
        NSLog(@"could not scale image");
    }

    //pop the context to get back to the default
    UIGraphicsEndImageContext();

    return newImage;
}

1
কৌতুহলপূর্ণভাবে এটি সিমুলেটারে কাজ করে তবে ডিভাইসে আমি এক্সেসবিডএ্যাক্সেস পেয়েছি ..
সোরিন আনটোহি

5
খারাপ এক্সিকিউটিভের সাথে সমস্যা দেখা দেয়, কারণ ইউআইআইমেজ ফাংশন থ্রেড নিরাপদ নয়। কেন এটি কিছুটা ক্র্যাশ হয়ে যায়, কখনও কখনও তা হয় না
এরিক

1
এই কোডটি আমার পক্ষে দুর্দান্ত কাজ করেছে, তবে এটি রেটিনার উপর ঝাপসা ছিল। প্রণীত সবকিছু নিখুঁত নিচে মন্তব্য সহ এই কোড মিশ্রন: stackoverflow.com/questions/603907/...
MaxGabriel

23
UIGraphicsBeginImageContextWithOptions (টার্গেটসাইজ, ইয়েস, 0.0) ব্যবহার করুন; রেটিনাতেও ছবিটি সুন্দর করে তোলা।
বোরুত তোমাজিন

1
এটি আমার জন্য প্রতিকৃতি মোডে কাজ করে তবে ল্যান্ডস্কেপ নয়। উচ্চতা আড়াআড়ি প্রসারিত হয়। কোন ধারণা কেন?
ড্যারেন

77

একটি পুরানো পোস্টে আপনার ইউআইজিমেজকে পুনরায় আকার দেওয়ার জন্য কোনও পদ্ধতির কোড রয়েছে। সম্পর্কিত অংশটি নিম্নরূপ:

+ (UIImage*)imageWithImage:(UIImage*)image 
               scaledToSize:(CGSize)newSize;
{
   UIGraphicsBeginImageContext( newSize );
   [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
   UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
   UIGraphicsEndImageContext();

   return newImage;
}

যতটা ফসল কাটা যায়, আমি বিশ্বাস করি যে আপনি যদি প্রসঙ্গের চেয়ে স্কেলিংয়ের জন্য আলাদা আকারের ব্যবহারের পদ্ধতিটি পরিবর্তন করেন তবে আপনার ফলাফলটি চিত্রটিকে প্রসঙ্গে সীমাবদ্ধ করা উচিত।


3
কেন এটি চিত্রের অভিযোজন স্থির করে তা নিয়ে কোনও সেনসেই তৈরি করে না, তবে এটি করে এবং এভাবে ক্যামেরাটি সঠিক দিকনির্দেশকে না ফিরিয়ে দিয়ে আমার সমস্যাটি স্থির করে originalImage। ধন্যবাদ।
ব্রেন্ডেন

10
আমি দেখতে পেলাম যে একটি রেটিনা ডিভাইসে একটি চিত্রের আকার পরিবর্তন করা অস্পষ্ট দেখাচ্ছে। স্বচ্ছতা বজায় রাখার জন্য, আমি নিম্নলিখিত প্রথম লাইন সংশোধিত: UIGraphicsBeginImageContextWithOptions(newSize, 1.0f, 0.0f);। : (এখানে ব্যাখ্যা stackoverflow.com/questions/4334233/... )
johngraham

এটি চিত্রটি ঘোরায় - তবে এটি সঠিকভাবে ক্রপ করে না! কেন এটি এত ভোট আপ?
দেজেল

18
+ (UIImage *)scaleImage:(UIImage *)image toSize:(CGSize)targetSize {
    //If scaleFactor is not touched, no scaling will occur      
    CGFloat scaleFactor = 1.0;

    //Deciding which factor to use to scale the image (factor = targetSize / imageSize)
    if (image.size.width > targetSize.width || image.size.height > targetSize.height)
        if (!((scaleFactor = (targetSize.width / image.size.width)) > (targetSize.height / image.size.height))) //scale to fit width, or
            scaleFactor = targetSize.height / image.size.height; // scale to fit heigth.

    UIGraphicsBeginImageContext(targetSize); 

    //Creating the rect where the scaled image is drawn in
    CGRect rect = CGRectMake((targetSize.width - image.size.width * scaleFactor) / 2,
                             (targetSize.height -  image.size.height * scaleFactor) / 2,
                             image.size.width * scaleFactor, image.size.height * scaleFactor);

    //Draw the image into the rect
    [image drawInRect:rect];

    //Saving the image, ending image context
    UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return scaledImage;
}

আমি এই এক প্রস্তাব। সে কি সৌন্দর্য নয়? ;)


1
এটি ভাল, যদি আপনি যদি বিবৃতিটি প্রথমে অপসারণ করেন তবে এটি AspectFill হিসাবে কাজ করে।
রাফএল

15

ইমেজগুলির পুনরায় আকার + অন্যান্য বেশ কয়েকটি ক্রিয়াকলাপ সম্পর্কিত একটি দুর্দান্ত কোড রয়েছে। আমি এই এক যখন ইমেজ মাপ পরিবর্তন কিভাবে OU চিন্তা করার চেষ্টা ... চারপাশে জড়ো http://vocaro.com/trevor/blog/2009/10/12/resize-a-uiimage-the-right-way/


7

আপনি এখানে যান। এই এক নিখুঁত ;-)

সম্পাদনা: নীচের মন্তব্যটি দেখুন - "নির্দিষ্ট চিত্রের সাথে কাজ করে না, এর সাথে ব্যর্থ হয়: সিজি কনটেক্সটসেটসেন্টারপোলেশনকুইটি: অবৈধ প্রসঙ্গ 0x0 ত্রুটি"

// Resizes the image according to the given content mode, taking into account the image's orientation
- (UIImage *)resizedImageWithContentMode:(UIViewContentMode)contentMode imageToScale:(UIImage*)imageToScale bounds:(CGSize)bounds interpolationQuality:(CGInterpolationQuality)quality {
    //Get the size we want to scale it to
    CGFloat horizontalRatio = bounds.width / imageToScale.size.width;
    CGFloat verticalRatio = bounds.height / imageToScale.size.height;
    CGFloat ratio;

    switch (contentMode) {
        case UIViewContentModeScaleAspectFill:
            ratio = MAX(horizontalRatio, verticalRatio);
            break;

        case UIViewContentModeScaleAspectFit:
            ratio = MIN(horizontalRatio, verticalRatio);
            break;

        default:
            [NSException raise:NSInvalidArgumentException format:@"Unsupported content mode: %d", contentMode];
    }

    //...and here it is
    CGSize newSize = CGSizeMake(imageToScale.size.width * ratio, imageToScale.size.height * ratio);


    //start scaling it
    CGRect newRect = CGRectIntegral(CGRectMake(0, 0, newSize.width, newSize.height));
    CGImageRef imageRef = imageToScale.CGImage;
    CGContextRef bitmap = CGBitmapContextCreate(NULL,
                                                newRect.size.width,
                                                newRect.size.height,
                                                CGImageGetBitsPerComponent(imageRef),
                                                0,
                                                CGImageGetColorSpace(imageRef),
                                                CGImageGetBitmapInfo(imageRef));

    CGContextSetInterpolationQuality(bitmap, quality);

    // Draw into the context; this scales the image
    CGContextDrawImage(bitmap, newRect, imageRef);

    // Get the resized image from the context and a UIImage
    CGImageRef newImageRef = CGBitmapContextCreateImage(bitmap);
    UIImage *newImage = [UIImage imageWithCGImage:newImageRef];

    // Clean up
    CGContextRelease(bitmap);
    CGImageRelease(newImageRef);

    return newImage;
}

1
সত্যিই সুন্দর দেখায় :) আমি এখানে ইন্টারপোলেশনকোয়ালিটি পছন্দ করি
কোস্টিয়ান্টিন সোকলিনস্কিই

নির্দিষ্ট চিত্রগুলির সাথে কাজ করে না, এর সাথে ব্যর্থ হয়: সিজি কনটেক্সটসেটসেন্টারপোলেশনকুটিয়ালিটি: অবৈধ প্রসঙ্গ 0x0 ত্রুটি
র্যাফএল

6

এটি সুইফটে জেন সেলসের উত্তরের একটি সংস্করণ। চিয়ার্স!

public func resizeImage(image: UIImage, size: CGSize) -> UIImage? {
    var returnImage: UIImage?

    var scaleFactor: CGFloat = 1.0
    var scaledWidth = size.width
    var scaledHeight = size.height
    var thumbnailPoint = CGPointMake(0, 0)

    if !CGSizeEqualToSize(image.size, size) {
        let widthFactor = size.width / image.size.width
        let heightFactor = size.height / image.size.height

        if widthFactor > heightFactor {
            scaleFactor = widthFactor
        } else {
            scaleFactor = heightFactor
        }

        scaledWidth = image.size.width * scaleFactor
        scaledHeight = image.size.height * scaleFactor

        if widthFactor > heightFactor {
            thumbnailPoint.y = (size.height - scaledHeight) * 0.5
        } else if widthFactor < heightFactor {
            thumbnailPoint.x = (size.width - scaledWidth) * 0.5
        }
    }

    UIGraphicsBeginImageContextWithOptions(size, true, 0)

    var thumbnailRect = CGRectZero
    thumbnailRect.origin = thumbnailPoint
    thumbnailRect.size.width = scaledWidth
    thumbnailRect.size.height = scaledHeight

    image.drawInRect(thumbnailRect)
    returnImage = UIGraphicsGetImageFromCurrentImageContext()

    UIGraphicsEndImageContext()

    return returnImage
}

2

আমি ব্র্যাড লারসনের কোডটি সংশোধন করেছি। এটি দিকনির্দেশিত চিত্রগুলিতে চিত্রটি পূর্ণ করবে।

-(UIImage*) scaleAndCropToSize:(CGSize)newSize;
{
    float ratio = self.size.width / self.size.height;

    UIGraphicsBeginImageContext(newSize);

    if (ratio > 1) {
        CGFloat newWidth = ratio * newSize.width;
        CGFloat newHeight = newSize.height;
        CGFloat leftMargin = (newWidth - newHeight) / 2;
        [self drawInRect:CGRectMake(-leftMargin, 0, newWidth, newHeight)];
    }
    else {
        CGFloat newWidth = newSize.width;
        CGFloat newHeight = newSize.height / ratio;
        CGFloat topMargin = (newHeight - newWidth) / 2;
        [self drawInRect:CGRectMake(0, -topMargin, newSize.width, newSize.height/ratio)];
    }

    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return newImage;
}

1
অন্য দুটি চিত্র, প্রতিকৃতি এবং ল্যান্ডস্কেপ দিয়ে পরীক্ষিত। এটি অ্যাসপেক্ট ফিল পূরণ করছে না।
র‌্যাফএল

2

কীভাবে আকার পরিবর্তন করতে হবে এবং তারপরে ইউআইআইমেজ (অ্যাসপেক্ট ফিল) ক্রপ করতে হবে সে সম্পর্কে গৃহীত উত্তরের জন্য জ্যামারিন.আইওএস সংস্করণটি নীচে রয়েছে

    public static UIImage ScaleAndCropImage(UIImage sourceImage, SizeF targetSize)
    {
        var imageSize = sourceImage.Size;
        UIImage newImage = null;
        var width = imageSize.Width;
        var height = imageSize.Height;
        var targetWidth = targetSize.Width;
        var targetHeight = targetSize.Height;
        var scaleFactor = 0.0f;
        var scaledWidth = targetWidth;
        var scaledHeight = targetHeight;
        var thumbnailPoint = PointF.Empty;
        if (imageSize != targetSize)
        {
            var widthFactor = targetWidth / width;
            var heightFactor = targetHeight / height;
            if (widthFactor > heightFactor)
            {
                scaleFactor = widthFactor;// scale to fit height
            }
            else
            {
                scaleFactor = heightFactor;// scale to fit width
            }
            scaledWidth = width * scaleFactor;
            scaledHeight = height * scaleFactor;
            // center the image
            if (widthFactor > heightFactor)
            {
                thumbnailPoint.Y = (targetHeight - scaledHeight) * 0.5f;
            }
            else
            {
                if (widthFactor < heightFactor)
                {
                    thumbnailPoint.X = (targetWidth - scaledWidth) * 0.5f;
                }
            }
        }
        UIGraphics.BeginImageContextWithOptions(targetSize, false, 0.0f);
        var thumbnailRect = new RectangleF(thumbnailPoint, new SizeF(scaledWidth, scaledHeight));
        sourceImage.Draw(thumbnailRect);
        newImage = UIGraphics.GetImageFromCurrentImageContext();
        if (newImage == null)
        {
            Console.WriteLine("could not scale image");
        }
        //pop the context to get back to the default
        UIGraphics.EndImageContext();

        return newImage;
    }

2

আমি স্যাম ভার্চের গাইডকে দ্রুত রূপান্তরিত করেছিলাম এবং এটি আমার পক্ষে ভাল কাজ করেছে, যদিও চূড়ান্ত চিত্রটিতে কিছু সামান্য "স্কুইশিং" রয়েছে যা আমি সমাধান করতে পারিনি।

func resizedCroppedImage(image: UIImage, newSize:CGSize) -> UIImage {
    var ratio: CGFloat = 0
    var delta: CGFloat = 0
    var offset = CGPointZero
    if image.size.width > image.size.height {
        ratio = newSize.width / image.size.width
        delta = (ratio * image.size.width) - (ratio * image.size.height)
        offset = CGPointMake(delta / 2, 0)
    } else {
        ratio = newSize.width / image.size.height
        delta = (ratio * image.size.height) - (ratio * image.size.width)
        offset = CGPointMake(0, delta / 2)
    }
    let clipRect = CGRectMake(-offset.x, -offset.y, (ratio * image.size.width) + delta, (ratio * image.size.height) + delta)
    UIGraphicsBeginImageContextWithOptions(newSize, true, 0.0)
    UIRectClip(clipRect)
    image.drawInRect(clipRect)
    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return newImage
}

যদি কেউ উদ্দেশ্য সি সংস্করণ চায়, এটি তার ওয়েবসাইটে।


2

আমি দেখতে পেয়েছি যে ইভেজনি কানভেটস পোস্ট করেছেন সুইফট 3 চিত্রটি অভিন্নভাবে স্কেল করে না।

চিত্রটি স্কুশ করে না এমন ফাংশনের আমার সুইফট 4 সংস্করণটি এখানে রয়েছে:

static func resizedCroppedImage(image: UIImage, newSize:CGSize) -> UIImage? {

    // This function returns a newImage, based on image
    // - image is scaled uniformaly to fit into a rect of size newSize
    // - if the newSize rect is of a different aspect ratio from the source image
    //     the new image is cropped to be in the center of the source image
    //     (the excess source image is removed)

    var ratio: CGFloat = 0
    var delta: CGFloat = 0
    var drawRect = CGRect()

    if newSize.width > newSize.height {

        ratio = newSize.width / image.size.width
        delta = (ratio * image.size.height) - newSize.height
        drawRect = CGRect(x: 0, y: -delta / 2, width: newSize.width, height: newSize.height + delta)

    } else {

        ratio = newSize.height / image.size.height
        delta = (ratio * image.size.width) - newSize.width
        drawRect = CGRect(x: -delta / 2, y: 0, width: newSize.width + delta, height: newSize.height)

    }

    UIGraphicsBeginImageContextWithOptions(newSize, true, 0.0)
    image.draw(in: drawRect)
    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return newImage
} 

আমাকে স্কেলিংটি 1.0 এ সেট করতে হয়েছিল UIGraphicsBeginImageContextWithOptionsতবে অন্যরা নিখুঁতভাবে কাজ করেছিল। ধন্যবাদ!
ম্যাক্সমজড

1

নিম্নলিখিত সহজ কোডটি আমার জন্য কাজ করেছিল।

[imageView setContentMode:UIViewContentModeScaleAspectFill];
[imageView setClipsToBounds:YES];

আপনার কোড UIImageViewবস্তুর জন্য ভাল কাজ করে। যাইহোক, এই প্রশ্নটি UIImageবস্তুটি নিজেই স্কেলিং সম্পর্কে ।
রিক্সার

1
scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0.0,0.0,ScreenWidth,ScreenHeigth)];
    [scrollView setBackgroundColor:[UIColor blackColor]];
    [scrollView setDelegate:self];
    [scrollView setShowsHorizontalScrollIndicator:NO];
    [scrollView setShowsVerticalScrollIndicator:NO];
    [scrollView setMaximumZoomScale:2.0];
    image=[image scaleToSize:CGSizeMake(ScreenWidth, ScreenHeigth)];
    imageView = [[UIImageView alloc] initWithImage:image];
    UIImageView* imageViewBk = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"background.png"]];
    [self.view addSubview:imageViewBk];
    CGRect rect;
    rect.origin.x=0;
    rect.origin.y=0;
    rect.size.width = image.size.width;
    rect.size.height = image.size.height;

    [imageView setFrame:rect];

    [scrollView setContentSize:[imageView frame].size];
    [scrollView setMinimumZoomScale:[scrollView frame].size.width / [imageView frame].size.width];
    [scrollView setZoomScale:[scrollView minimumZoomScale]];
    [scrollView addSubview:imageView];

    [[self view] addSubview:scrollView];

তাহলে আপনি এটির মাধ্যমে আপনার চিত্রটিতে স্ক্রিন শট নিতে পারেন

float zoomScale = 1.0 / [scrollView zoomScale];
CGRect rect;
rect.origin.x = [scrollView contentOffset].x * zoomScale;
rect.origin.y = [scrollView contentOffset].y * zoomScale;
rect.size.width = [scrollView bounds].size.width * zoomScale;
rect.size.height = [scrollView bounds].size.height * zoomScale;

CGImageRef cr = CGImageCreateWithImageInRect([[imageView image] CGImage], rect);

UIImage *cropped = [UIImage imageWithCGImage:cr];

CGImageRelease(cr);

0
- (UIImage*)imageScale:(CGFloat)scaleFactor cropForSize:(CGSize)targetSize
{
    targetSize = !targetSize.width?self.size:targetSize;
    UIGraphicsBeginImageContext(targetSize); // this will crop

    CGRect thumbnailRect = CGRectZero;

    thumbnailRect.size.width  = targetSize.width*scaleFactor;
    thumbnailRect.size.height = targetSize.height*scaleFactor;
    CGFloat xOffset = (targetSize.width- thumbnailRect.size.width)/2;
    CGFloat yOffset = (targetSize.height- thumbnailRect.size.height)/2;
    thumbnailRect.origin = CGPointMake(xOffset,yOffset);

    [self drawInRect:thumbnailRect];

    UIImage *newImage  = UIGraphicsGetImageFromCurrentImageContext();

    if(newImage == nil)
    {
        NSLog(@"could not scale image");
    }

    UIGraphicsEndImageContext();

    return newImage;
}

কাজের উদাহরণের নীচে: বাম চিত্র - (উত্স চিত্র); স্কেল এক্স 2 সহ ডান চিত্র

এখানে চিত্র বর্ণনা লিখুন

আপনি যদি চিত্র স্কেল করতে চান তবে এর ফ্রেম ধরে রাখতে (অনুপাত), এই পদ্ধতিতে কল করুন:

[yourImage imageScale:2.0f cropForSize:CGSizeZero];

0

এই প্রশ্নটি বিশ্রামে রাখা হয়েছে বলে মনে হয়, তবে এমন সমাধানের সন্ধানের জন্য যা আমি আরও সহজেই বুঝতে পারি (এবং সুইফটে লিখিত), আমি এটি পৌঁছে দিয়েছি (এটিও পোস্ট করেছেন: ইউআইআইমেজ ক্রপ করবেন কীভাবে? )


আমি একটি অনুপাতের উপর ভিত্তি করে একটি অঞ্চল থেকে ফসল তুলতে সক্ষম হতে চেয়েছি এবং বাইরের সীমানা সীমার ভিত্তিতে আকারে স্কেল করতে পেরেছি। এখানে আমার প্রকরণ:

import AVFoundation
import ImageIO

class Image {

    class func crop(image:UIImage, crop source:CGRect, aspect:CGSize, outputExtent:CGSize) -> UIImage {

        let sourceRect = AVMakeRectWithAspectRatioInsideRect(aspect, source)
        let targetRect = AVMakeRectWithAspectRatioInsideRect(aspect, CGRect(origin: CGPointZero, size: outputExtent))

        let opaque = true, deviceScale:CGFloat = 0.0 // use scale of device's main screen
        UIGraphicsBeginImageContextWithOptions(targetRect.size, opaque, deviceScale)

        let scale = max(
            targetRect.size.width / sourceRect.size.width,
            targetRect.size.height / sourceRect.size.height)

        let drawRect = CGRect(origin: -sourceRect.origin * scale, size: image.size * scale)
        image.drawInRect(drawRect)

        let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return scaledImage
    }
}

আমি কয়েকটি বিভ্রান্তিকর বিষয় পেয়েছি যা ফসল কাটা এবং পুনরায় আকার দেওয়ার পৃথক উদ্বেগ। ক্রপিংটি আপনি আঁকারআইনরেটকে পাস করে এমন রেকটটির উত্স দিয়ে পরিচালনা করা হয় এবং আকারটি স্কেলিং পরিচালনা করা হয়। আমার ক্ষেত্রে, উত্সের ক্রপিং রেক্টের আকার এবং একই দিক অনুপাতের আমার আউটপুট রেক্টের সাথে আমার সম্পর্কিত হওয়া দরকার। স্কেল ফ্যাক্টরটি তারপরে আউটপুট / ইনপুট হয় এবং এটি ড্রআরেক্টে প্রয়োগ করা প্রয়োজন (অঙ্কনরেটকে পাস করা হয়েছে)।

একটি সতর্কতাই হ'ল এই পদ্ধতিটি কার্যকরভাবে ধরে নিয়েছে যে আপনি যে চিত্রটি আঁকছেন তা চিত্রের প্রসঙ্গে larger আমি এটি পরীক্ষা করেছি না, তবে আমি মনে করি আপনি ক্রপিং / জুমিং পরিচালনা করতে এই কোডটি ব্যবহার করতে পারেন তবে স্কেল প্যারামিটারটিকে স্পষ্টভাবে সংজ্ঞায়িত করে উপরোক্ত স্কেল প্যারামিটার হিসাবে গণ্য করতে পারেন। ডিফল্টরূপে, ইউআইকিট স্ক্রিন রেজোলিউশনের ভিত্তিতে একটি গুণক প্রয়োগ করে।

অবশেষে, এটি লক্ষ করা উচিত যে এই ইউআইকিট পদ্ধতিরটি কোরিগ্রাফিক্স / কোয়ার্টজ এবং কোর চিত্রের পদ্ধতির চেয়ে উচ্চতর স্তর এবং এটি চিত্র ওরিয়েন্টেশন সম্পর্কিত সমস্যাগুলি পরিচালনা করছে বলে মনে হচ্ছে। এটি এখানেও উল্লেখযোগ্য যে এটি বেশ দ্রুত, ইমেজআইওর পরে দ্বিতীয়, এখানে এই পোস্ট অনুসারে: http://nshipster.com/image-resizing/


0

সুইফ্ট সংস্করণ:

    static func imageWithImage(image:UIImage, newSize:CGSize) ->UIImage {
    UIGraphicsBeginImageContextWithOptions(newSize, true, UIScreen.mainScreen().scale);
    image.drawInRect(CGRectMake(0, 0, newSize.width, newSize.height))

    let newImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();
    return newImage
}

1
সুন্দর সামান্য কাজ তবে আমি নিশ্চিত যে এটি চিত্রটিকে একটি নির্দিষ্ট আকারে কেবল প্রসারিত করে, অনুপাতের অনুপাত এবং শস্যকে রাখবে না ...
উইলিয়াম টি।

হ্যাঁ আপনার কাছে ঠিক আছে, এটি কেবল চিত্রটিকে একটি চৌম্বক আকারে স্রেচ করার জন্য।
রোমান বারজাইকাক

0

এখানে উইলিয়াম টি পোস্ট করেছেন সিম ভার্চের গাইডের স্যুইফট 3 সংস্করণ is

extension UIImage {

    static func resizedCroppedImage(image: UIImage, newSize:CGSize) -> UIImage? {
        var ratio: CGFloat = 0
        var delta: CGFloat = 0
        var offset = CGPoint.zero

        if image.size.width > image.size.height {
            ratio = newSize.width / image.size.width
            delta = (ratio * image.size.width) - (ratio * image.size.height)
            offset = CGPoint(x: delta / 2, y: 0)
        } else {
            ratio = newSize.width / image.size.height
            delta = (ratio * image.size.height) - (ratio * image.size.width)
            offset = CGPoint(x: 0, y: delta / 2)
        }

        let clipRect = CGRect(x: -offset.x, y: -offset.y, width: (ratio * image.size.width) + delta, height: (ratio * image.size.height) + delta)
        UIGraphicsBeginImageContextWithOptions(newSize, true, 0.0)
        UIRectClip(clipRect)
        image.draw(in: clipRect)
        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return newImage
    }

}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.