Bir UIImage ile başladığınızı ve bunu kırpmak istediğinizi varsayalım. Şimdi Sonradan bir NSData nesnesine bu UIImage dönüştürmek gerekir diyelimBir CGImageRef öğesinden oluşturulmuş bir UIImage nesnesini ham verilere dönüştürme ve geri dönme
CGRect cropRect = CGRectMake(x*width, y*height, width, height);
CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], cropRect);
UIImage *croppedImage = [UIImage imageWithCGImage:imageRef];
: En yaygın yöntem, bir CGImageRef almak için CGImageCreateWithImageInRect kullanabilir ve böylece ondan yeni bir resim oluşturmaktır. Örneğin, görüntüyü NSKeyedArchiver kullanarak diskte saklamak isterseniz bu gerçekleşir. Ya açıkça şu bir NSData yaparak dışarı nesne alabilirsiniz: Ben için yaptım
UIImage *image = [UIImage imageWithData:imageData];
:
NSData *imageData = UIImagePNGRepresentation(croppedImage);
ben yaparak yeni bir UIImage nesnesini yeniden çalıştı daha sonra bu yaptı ve 48 görüntü dizisi. Birçoğu iyiydi, ama her 4 görüntüden sonra, sonraki 2, her bir resmin üst ve alt kısmı ile değiştirildi. Dönüştürmeyi NSData'ya geri alıp tekrar geri alırsam, iyi çalışıyor. Ben de diske görüntülerin bir dizi yazmak için NSKeyedArchiver kullanıyorsanız (aynı zamanda kendi kodlama rutin UIImagePNGRepresentation gibi bir şey çağrıları tahmin) kullanırsanız ben de aynı sorunu olsun. Benim teorim, CGImageRefs'den görüntüleri nasıl oluşturduğumla ilgili bir şey olmalı.
Bunun için geçici çözüm nedir? CGImageRefs'i NSData nesnesine nasıl yerleştireceğimi anlayamıyorum ve UIImage'ı seri hale getirecek şekilde doğru bir şekilde oluşturmayı tercih ederim.
Düzenleme:
Bazı insanlar yürütülüyor fiili kodu istenecektir, bu yüzden self.animationObject.image gelen görüntü numInX ve görüntülerin bir ızgara burada
UIImage *image = self.animationObject.image;
for (int y=0; y<[self.animationInfoObject.numInY intValue]; y++) {
for (int x=0; x<[self.animationInfoObject.numInX intValue]; x++) {
CGRect cropRect = CGRectMake(x*width, y*height, width, height);
CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], cropRect);
UIImage *croppedImage = [UIImage imageWithCGImage:imageRef];
NSData *imageData = UIImageJPEGRepresentation(croppedImage, 1.0);
[self addImageToArray:imageData];
CFRelease(imageRef);
}
}
bunu ekliyorum ve her yöne DOĞRU görüntüler. Her bir görüntüyü 2B ızgaradan kırpıp kaydediyorum.
Daha sonra, görüntüleri canlandırmak için görüntüleri bir resim görünümünde koyuyorum.
NSMutableArray *animationArray = [[NSMutableArray alloc] init];
for (int frame=0; frame<[[photoObject frameArray] count]; frame++) {
NSData *imageData =[[photoObject imageArray] objectAtIndex:[[[photoObject frameArray] objectAtIndex:frame] integerValue]-1];
UIImage *image = [UIImage imageWithData:imageData];
[animationArray addObject:image];
}
Bunların hepsi bir iPhone 6 üzerinde çalışıyor ancak aynı zamanda görüntülerin ızgara uzun olduğunda sadece bir sorun gibi görünüyor bir iPhone 5. çalışmıyor: İşte kodudur. Örneğin, kullanıyorum örnek için self.animationObject.image 3 olarak numInY ve numInX 2 ve görüntünün toplam boyutu 1536x3072 (her mini görüntü 768x1024). Üstleri ve dipleri ters çevrilmiş en alttaki iki resim.
Biraz daha yararlı ayrıntıları awolf için kredi. Her biri 2x3 ızgarada 6 küçük resim içeren kompozit görüntülerim var. Her görüntünün boyutu 768x1024'tür, bu nedenle bileşik görüntünün toplam boyutu 1536x3072'dir. Her bir kompozitin alt ve üst yarısı değiştirilmiş olan 5. ve 6. resimlerdir. Yani, CGImage hakkında, büyük bir görüntünün alt kısmına kırpmadan kaynaklanan bir şey olabilir, belki? Yine, UIImage'ın NSData'ya dönüştürülmediği ve tekrar geri dönmediği takdirde bunun mükemmel şekilde çalıştığından bahsetmeliyim. – Mike
Yukarıdaki bu incelemede, genişlik 768, yükseklik 1024 ve x, 0 veya 1 ve y olduğunda 2 bozuluyor. Y, 0 veya 1 olduğunda iyi çalışıyor. Bu CGImageCreateWithImageInRect, yalnızca ile başa çıkamıyor büyük görüntüler mi? – Mike
Buna neyin sebep olduğunu görmek zor. Bunu bir test uygulaması olarak paketlemeyi ve bugreporter.apple.com'da bir radarı göndermeyi öneririm. Ya da yedek bir DTS olayınız varsa, bir iş bulmak umuduyla bunları çalıştırın. –