2012-07-12 22 views
7

Zaten çok fazla Tarafımdan çaba harcıyorum. Sonunda yardıma ihtiyacım var. teşekkürlerkırparak ImageView içinde yakınlaştırılmış bir görüntüViewView

Hedef: 1) içimde scrollview bir Yakınlaştırılmış Resmi kırpmak Nasıl scrollview

2) içine imageView sığacak nasıl.

Ben Kaydırma Görünüm içinde bir imageView var. Yakınlaştırdıktan sonra scrollview sınırında görüntülenen kırpma görüntüsünü istiyorum. Görüntüyü kırptım ama istediğim gibi değil.

İşte benim Scrollview için backgroundColor Siyah ayarlayın. Ve içinde imageView yerleştirdiğimde, bu uygun değil. enter image description here

enter image description here

ve kırpma postimaj

enter image description here

olan kaydırma görünümünde iç yakınlaştırma görüntü sonra ve benim kod İşte:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    CGRect frame1 = CGRectMake(50,50,200,200); 

    CGRect frame2 = CGRectMake(50,50,200,200); 

    imageView1=[[UIImageView alloc]initWithFrame:frame1]; 

    imageView1.image= [UIImage imageNamed:@"back.jpeg"]; 

    imageView1.backgroundColor=[UIColor brownColor]; 

    imageView1.contentMode = UIViewContentModeScaleAspectFit; 



    scroll=[[UIScrollView alloc]initWithFrame:frame2]; 

    scroll.backgroundColor=[UIColor blackColor]; 

    [scroll addSubview:imageView1]; 

    scroll.delegate=self; 

[self.view addSubview:scroll]; 

[self setContentSizeForScrollView]; 

self.imageView1.userInteractionEnabled = YES; 

} 

ayar s Croll görünüm

-(void)setContentSizeForScrollView 
{ 
// scroll.contentSize = CGSizeMake(imageView1.frame.size.width,imageView1.frame.size.height); 

    scroll.contentSize = CGSizeMake(200, 200); 
    scroll.minimumZoomScale = .50; 
    scroll.maximumZoomScale = 1.5; 
} 

contentSize ve benim mahsul mantık

-(IBAction)cropButtonClicked 
{ 
    //Calculate the required area from the scrollview 

CGRect rect = CGRectMake(50, 50, 200,200); 


UIImage *image = [self imageByCropping:imageView1.image toRect:rect]; 

imageView1.image=image; 


imageView1.contentMode = UIViewContentModeScaleAspectFit; 


} 

Ve bu yöntem kırpma resim: Kendi Sorunu'nun

- (UIImage*)imageByCropping:(UIImage *)myImage toRect:(CGRect)cropToArea{ 
    CGImageRef cropImageRef = CGImageCreateWithImageInRect(myImage.CGImage, cropToArea); 
    UIImage* cropped = [UIImage imageWithCGImage:cropImageRef]; 

    CGImageRelease(cropImageRef); 
    return cropped; 
} 

cevap

3

Cevap: birçok çalışmalar sonucunda ben cevabını buldu her iki sorumlunun da

ve bu benim için iyi çalışır. Burada paylaşıyorum, birine yardım edebilir. Kaydırma Görünüm içeride :)

1) Fit görüntü Görünüm. Bu link

- (void)centerScrollViewContents { 

CGSize boundsSize = scroll.bounds.size; 
CGRect contentsFrame = self.imageView1.frame; 

if (contentsFrame.size.width < boundsSize.width) { 
contentsFrame.origin.x = (boundsSize.width - contentsFrame.size.width)/2.0f; 
} 
else { 
contentsFrame.origin.x = 0.0f; 
} 

if (contentsFrame.size.height < boundsSize.height) { 
    contentsFrame.origin.y = (boundsSize.height - contentsFrame.size.height)/2.0f; 
} 
else { 
contentsFrame.origin.y = 0.0f; 
} 

self.imageView1.frame = contentsFrame; 
} 

2) iç scrollview bir Yakınlaştırılmış Görüntüyü kırpmak kullanın. Kullandığım bu link Geçenlerde benzer bir sorun vardı, ben göreli bir fikir kullanarak çözüm var

UIGraphicsBeginImageContext(CGSizeMake(200, 200)); 

    [scroll.layer renderInContext:UIGraphicsGetCurrentContext()]; 

    UIImage *fullScreenshot = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 

    imageView1.contentMode = UIViewContentModeScaleAspectFill; 

    UIImageWriteToSavedPhotosAlbum(fullScreenshot, nil, nil, nil); 

    return fullScreenshot; 
2

(Xa, b = Xa, c - c Xb,)

-(IBAction)crop:(id)sender{ 

     // F = frame 
     // i = image 
     // iv = imageview 
     // sv = self.view 
     // of = offset 

     //Frame Image in imageView coordinates 
     CGRect Fi_iv = [self frameForImage:self.image inImageViewAspectFit:self.imageView]; 

     //Frame ImageView in self.view coordinates 
     CGRect Fiv_sv = self.imageView.frame; 

     //Frame Image in self.view coordinates 
     CGRect Fi_sv = CGRectMake(Fi_iv.origin.x + Fiv_sv.origin.x 
            ,Fi_iv.origin.y + Fiv_sv.origin.y, 
            Fi_iv.size.width, Fi_iv.size.height); 
     //ScrollView offset 
     CGPoint offset = self.scrollView.contentOffset; 

     //Frame Image in offset coordinates 
     CGRect Fi_of = CGRectMake(Fi_sv.origin.x - offset.x, 
             Fi_sv.origin.y - offset.y, 
             Fi_sv.size.width, 
             Fi_sv.size.height); 

     CGFloat scale = self.imageView.image.size.width/Fi_of.size.width; 

     //the crop frame in image offset coordinates 
     CGRect Fcrop_iof = CGRectMake((self.cropView.frame.origin.x - Fi_of.origin.x)*scale, 
             (self.cropView.frame.origin.y - Fi_of.origin.y)*scale, 
             self.cropView.frame.size.width*scale, 
             self.cropView.frame.size.height*scale); 

     UIImage *image = [self image:self.imageView.image cropRect:Fcrop_iof]; 
     // Use this crop image... 

Sen kesebilirsiniz görüntü kullanarak:

//Use this code to crop when you have the right frame 
-(UIImage*)image:(UIImage *)image cropRect:(CGRect)frame 
{ 
    // Create a new UIImage 
    CGImageRef imageRef = CGImageCreateWithImageInRect(image.CGImage, frame); 
    UIImage *croppedImage = [UIImage imageWithCGImage:imageRef]; 
    CGImageRelease(imageRef); 

    return croppedImage; 
} 

Eğer Aspect Fit'teki ImageView kullanarak olduğundan, imageview

içindeki resim çerçevesi hesaplamak gerekir
-(CGRect)frameForImage:(UIImage*)image inImageViewAspectFit:(UIImageView*)imageView 
{ 
    float imageRatio = image.size.width/image.size.height; 

    float viewRatio = imageView.frame.size.width/imageView.frame.size.height; 

    if(imageRatio < viewRatio) 
    { 
     float scale = imageView.frame.size.height/image.size.height; 

     float width = scale * image.size.width; 

     float topLeftX = (imageView.frame.size.width - width) * 0.5; 

     return CGRectMake(topLeftX, 0, width, imageView.frame.size.height); 
    } 
    else 
    { 
     float scale = imageView.frame.size.width/image.size.width; 

     float height = scale * image.size.height; 

     float topLeftY = (imageView.frame.size.height - height) * 0.5; 

     return CGRectMake(0, topLeftY, imageView.frame.size.width, height); 
    } 
} 

benim için çalıştı bu kodu sizin için çalışabilir umuyoruz.

En iyi,

Rafael.

+0

Bunu salliyorum. Yukarıdaki kodla bulduğum tek sorun, "// resim ofset koordinatlarındaki kırpma karesi" başlığının altındaki koddur. Self.cropview.raunds kullanırken, self.cropview.frame kullanıyorsunuz. –

+1

Harika ..... teşekkürler dostum .. harika çalışıyor .. – Gokul

İlgili konular