Jak ustawić granicę UIImage
?Jak mogę wziąć UIImage i dać mu czarną granicę?
Odpowiedz
Można manipulować samym obrazem, ale o wiele lepszym sposobem jest po prostu dodać UIView zawierający UIImageView i zmienić tło na czarne. Następnie ustaw rozmiar tego widoku kontenera na nieco większy niż UIImageView.
Czy to będzie działać z innym rozmiarem obrazów, które zmieniają się w locie? UIImageView zmieni się cały czas i UIView? p.s. Sam manipuluj obrazem będzie świetny. – Shay
Należy dopasować ramkę widoku zawierającego wraz z obrazem - można zaoszczędzić na środkowych właściwościach dla obu widoków, dostosować rozmiar obrazu, dostosować rozmiar pojemnika, a następnie ponownie ustawić właściwości środka dla obu. –
To jest dokładnie sposób, w jaki to zrobiłem, a nie obrysowywanie ścieżki za pomocą CG. wydawało się łatwiejsze. –
Nie można dodać obramowania, ale działałoby to na ten sam efekt. Można również ustawić UIView o nazwie blackBG w tym przykładzie w UIImageView z obrazem obramowania i pustym środkiem, a następnie masz niestandardową obramowanie obrazu, a nie tylko czerń.
UIView *blackBG = [[UIView alloc] initWithFrame:CGRectMake(0,0,100,100)];
blackBG.backgroundColor = [UIColor blackColor];
UIImageView *myPicture = [[UIImageView alloc] initWithImage:
[UIImage imageNamed: @"myPicture.jpg"]];
int borderWidth = 10;
myPicture.frame = CGRectMake(borderWidth,
borderWidth,
blackBG.frame.size.width-borderWidth*2,
blackBG.frame.size.height-borderWidth*2)];
[blackBG addSubview: myPicture];
Oto, co zrobiłem; zagnieżdżanie mojego 'UIImageView' w centrum nieco większego' UIView' mojego koloru ramki. –
Można to zrobić poprzez stworzenie nowego wizerunku (również odpowiedział w drugim delegowania to pytanie):
- (UIImage*)imageWithBorderFromImage:(UIImage*)source;
{
CGSize size = [source size];
UIGraphicsBeginImageContext(size);
CGRect rect = CGRectMake(0, 0, size.width, size.height);
[source drawInRect:rect blendMode:kCGBlendModeNormal alpha:1.0];
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetRGBStrokeColor(context, 1.0, 0.5, 1.0, 1.0);
CGContextStrokeRect(context, rect);
UIImage *testImg = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return testImg;
}
Kod ten będzie produkować różowy obramowanie wokół obrazu. Jeśli jednak chcesz wyświetlić tylko granicę, użyj warstwy UIImageView
i ustaw jej obramowanie.
Z OS> 3.0 można to zrobić:
//you need this import
#import <QuartzCore/QuartzCore.h>
[imageView.layer setBorderColor: [[UIColor blackColor] CGColor]];
[imageView.layer setBorderWidth: 2.0];
Możesz dodać obramowanie do UIImageView, a następnie zmienić rozmiar UIImageView w zależności od wielkości obrazu:
#import <QuartzCore/QuartzCore.h>
// adding border to the imageView
[imageView.layer setBorderColor: [[UIColor whiteColor] CGColor]];
[imageView.layer setBorderWidth: 2.0];
// resize the imageView to fit the image size
CGSize size = [image size];
float factor = size.width/self.frame.size.width;
if (factor < size.height/self.frame.size.height) {
factor = size.height/self.frame.size.height;
}
CGRect rect = CGRectMake(0, 0, size.width/factor, size.height/factor);
imageView.frame = rect;
Makijażu upewnij się, że ustawiłeś początek obrazuView na centrum
#import <QuartzCore/CALayer.h>
UIImageView *imageView = [UIImageView alloc]init];
imageView.layer.masksToBounds = YES;
imageView.layer.borderColor = [UIColor blackColor].CGColor;
imageView.layer.borderWidth = 1;
Ten kod może być używany do dodawaniazobacz obramowanie.
idealne! Nie musisz przechodzić przez kłopoty z CGImage. (Nie musiałem zapisywać obrazu z ramką). Wielkie dzięki! – Septronic
wszystkie te odpowiedzi działają dobrze, ALE dodać rect do obrazu. Załóżmy, że masz kształt (w moim przypadku motyla) i chcesz dodać obramowanie (czerwoną ramkę):
potrzebujemy dwóch etapów: 1) podjęcia obraz, konwersja do CGImage, przechodzą do funkcji wyciągnąć poza ekranem w kontekście pomocą CoreGraphics i oddać nowy CGImage
2) konwersji do UIImage tyłu i rysować:
// remember to release object!
+ (CGImageRef)createResizedCGImage:(CGImageRef)image toWidth:(int)width
andHeight:(int)height
{
// create context, keeping original image properties
CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(NULL, width,
height,
8
4 * width,
colorspace,
kCGImageAlphaPremultipliedFirst
);
CGColorSpaceRelease(colorspace);
if(context == NULL)
return nil;
// draw image to context (resizing it)
CGContextSetInterpolationQuality(context, kCGInterpolationDefault);
CGSize offset = CGSizeMake(2,2);
CGFloat blur = 4;
CGColorRef color = [UIColor redColor].CGColor;
CGContextSetShadowWithColor (context, offset, blur, color);
CGContextDrawImage(context, CGRectMake(0, 0, width, height), image);
// extract resulting image from context
CGImageRef imgRef = CGBitmapContextCreateImage(context);
CGContextRelease(context);
return imgRef;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
CGRect frame = CGRectMake(0,0,160, 122);
UIImage * img = [UIImage imageNamed:@"butterfly"]; // take low res OR high res, but frame should be the low-res one.
imgV = [[UIImageView alloc]initWithFrame:frame];
[imgV setImage: img];
imgV.center = self.view.center;
[self.view addSubview: imgV];
frame.size.width = frame.size.width * 1.3;
frame.size.height = frame.size.height* 1.3;
CGImageRef cgImage =[ViewController createResizedCGImage:[img CGImage] toWidth:frame.size.width andHeight: frame.size.height ];
imgV2 = [[UIImageView alloc]initWithFrame:frame];
[imgV2 setImage: [UIImage imageWithCGImage:cgImage] ];
// release:
if (cgImage) CGImageRelease(cgImage);
[self.view addSubview: imgV2];
}
Dodałem normalnego motyla i większy motyl w czerwonym obwodzie.
jest tutaj jakiś sposób na ustawienie szerokości czerwonej granicy. – coder1010
Jeśli znasz wymiary swojego obrazu, najlepszym rozwiązaniem AFAIK jest dodanie ramki do warstwy UIImageView. Rzeczywiste, możesz po prostu ustawićFrame your imageView na x, y, image.size.width, image.size.height
Jeśli masz ImageView o stałym rozmiarze z dynamicznie ładowanymi obrazami, które są zmieniane (lub skalowane do AspectFit), wtedy twoim celem jest zmiana rozmiaru widoku obrazu na nowy obraz o zmienionym rozmiarze.
Najkrótsza droga do tego celu:
// containerView is my UIImageView
containerView.layer.borderWidth = 7;
containerView.layer.borderColor = [UIColor colorWithRed:0.22 green:0.22 blue:0.22 alpha:1.0].CGColor;
// this is the key command
[containerView setFrame:AVMakeRectWithAspectRatioInsideRect(image.size, containerView.frame)];
Ale używać AVMakeRectWithAspectRatioInsideRect, trzeba dodać to stwierdzenie
#import <AVFoundation/AVFoundation.h>
import do pliku, a także ramy AVFoundation w projekcie (jest dołączony do pakietu SDK).
To jest naprawdę dobra, łatwa i najlepsza odpowiedź tutaj! – rafinskipg
Dzięki @rafinskipg! Bardzo doceniane. – ScorpionKing2k5
Funkcja ta powoduje powrót obraz z czarnym obramowaniem spróbować .. nadzieję, że to pomoże Ci
- (UIImage *)addBorderToImage:(UIImage *)image frameImage:(UIImage *)blackBorderImage
{
CGSize size = CGSizeMake(image.size.width,image.size.height);
UIGraphicsBeginImageContext(size);
CGPoint thumbPoint = CGPointMake(0,0);
[image drawAtPoint:thumbPoint];
UIGraphicsBeginImageContext(size);
CGImageRef imgRef = blackBorderImage.CGImage;
CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, size.width,size.height), imgRef);
UIImage *imageCopy = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
CGPoint starredPoint = CGPointMake(0, 0);
[imageCopy drawAtPoint:starredPoint];
UIImage *imageC = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return imageC;
}
Jeśli znalazłeś jakieś informacje, daj mi znać ... poprawię je – SachinVsSachin
// trzeba importować
QuartzCore/QuartzCore.h
& następnie do ImageView w granicy
[imageView.layer setBorderColor: [[UIColor blackColor] CGColor]];
[imageView.layer setBorderWidth: 2.0];
[imageView.layer setCornerRadius: 5.0];
Innym sposobem jest zrobienie bezpośrednio od projektanta.
Wybierz zdjęcie i przejdź do "Pokaż inspektora tożsamości".
Tutaj można ręcznie dodać "User Defined Runtime Atrybuty":
layer.borderColor
layer.borderWidth
To nie zadziała, ponieważ potrzebujesz CGColor i przez XIB zapewnia tylko UIColor – codesnooker
Kolor nie działa, ale jeśli potrzebujesz tylko czarnego - jest to najbardziej efektywna odpowiedź "linii kodu" = D – soprof
imageView_ProfileImage.layer.cornerRadius =10.0f;
imageView_ProfileImage.layer.borderColor = [[UIColor blackColor] CGColor];
imageView_ProfileImage.layer.borderWidth =.4f;
imageView_ProfileImage.layer.masksToBounds = YES;
Znakomity hack, zwłaszcza jeśli chodzi o użycie pamięci - pozostałe odpowiedzi zajmą 2x pamięć tylko po to, by chwilowo dodać tę granicę. Wskazówka dla profesjonalistów - jeśli chcesz po prostu dodać obramowanie z jednej strony, możesz również zmienić te ograniczenia. Świetna odpowiedź! – judepereira
w Swift 3 oto jak to zrobić dla samego UIImage :
let size = CGSize(width: image.size.width, height: image.size.height)
UIGraphicsBeginImageContext(size)
let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height)
image?.draw(in: rect, blendMode: .normal, alpha: 1.0)
let context = UIGraphicsGetCurrentContext()
context?.setStrokeColor(red: 0, green: 0, blue: 0, alpha: 1)
context?.stroke(rect)
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.imageView.image = newImage
Dla tych, którzy szukają rozwiązania plug-and-play na UIImage, napisałem odpowiedź CodyMace jako rozszerzenie.
Zastosowanie: let outlined = UIImage(named: "something")?.outline()
extension UIImage {
func outline() -> UIImage? {
let size = CGSize(width: self.size.width, height: self.size.height)
UIGraphicsBeginImageContext(size)
let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height)
self.draw(in: rect, blendMode: .normal, alpha: 1.0)
let context = UIGraphicsGetCurrentContext()
context?.setStrokeColor(red: 0, green: 0, blue: 0, alpha: 1)
context?.stroke(rect)
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
}
użyć tej metody, aby dodać obramowanie poza obrazem. Możesz dostosować szerokość obramowania w stałej boderWidth
.
Swift 3
func addBorderToImage(image : UIImage) -> UIImage {
let bgImage = image.cgImage
let initialWidth = (bgImage?.width)!
let initialHeight = (bgImage?.height)!
let borderWidth = Int(Double(initialWidth) * 0.10);
let width = initialWidth + borderWidth * 2
let height = initialHeight + borderWidth * 2
let data = malloc(width * height * 4)
let context = CGContext(data: data,
width: width,
height: height,
bitsPerComponent: 8,
bytesPerRow: width * 4,
space: (bgImage?.colorSpace)!,
bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue);
context?.draw(bgImage!, in: CGRect(x: CGFloat(borderWidth), y: CGFloat(borderWidth), width: CGFloat(initialWidth), height: CGFloat(initialHeight)))
context?.setStrokeColor(UIColor.white.cgColor)
context?.setLineWidth(CGFloat(borderWidth))
context?.move(to: CGPoint(x: 0, y: 0))
context?.addLine(to: CGPoint(x: 0, y: height))
context?.addLine(to: CGPoint(x: width, y: height))
context?.addLine(to: CGPoint(x: width, y: 0))
context?.addLine(to: CGPoint(x: 0, y: 0))
context?.strokePath()
let cgImage = context?.makeImage()
let uiImage = UIImage(cgImage: cgImage!)
free(data)
return uiImage;
}
- 1. Jak utworzyć czarną UIImage?
- 2. Dlaczego ten kod wyświetlający GLView zwraca pustą/czarną UIImage?
- 3. Jak wziąć tablicę łańcuchów i przefiltrować je?
- 4. Jak mogę uzyskać UIImage z GPUImageView
- 5. Jak mogę zrobić plik PDF z UIImage?
- 6. Jak ukryć granicę UITextField?
- 7. Obracanie i przycinanie UIImage
- 8. presentViewController pokazuje czarną stronę
- 9. Jak mogę uzyskać CGContextRef z UIImage?
- 10. Jak mogę zapisać UIImage w NSDictionary?
- 11. Jak utworzyć czarną listę IP w Symfony2?
- 12. Jak narysować rozjaśnioną granicę (efekt poświaty zewnętrznej)?
- 13. Niestandardowy tytuł AlertDialog ma czarną ramkę
- 14. UIImage i resizableImageWithCapInsets Swift
- 15. Jak mogę wziąć tablicę, podzielić ją na dwie części i utworzyć dwie listy?
- 16. Ustaw granicę w UICollectionView
- 17. Jak przesłonić granicę: brak?
- 18. Jak usunąć czarną listę dla rozszerzenia?
- 19. Jak usunąć dodatkową czarną linię pod UISearchBarem?
- 20. Jak usunąć czarną część z obrazu?
- 21. NSData i UIImage
- 22. Jak mogę dać kompilatorowi Intellijmu więcej miejsca na sterty?
- 23. SQL - SELECT MAX() i towarzyszące mu pole
- 24. Highcharts: Jak mogę wziąć wartość osi X w etykiecie narzędzia?
- 25. W ggplot2, jak mogę zmienić granicę wybranych aspektów?
- 26. Jak mogę nadać elementowi WPF prostokątną, płaską granicę 3D?
- 27. Jak mogę wziąć pierwiastek kwadratowy z -1 przy użyciu Pythona?
- 28. Gdzie mogę znaleźć czarną listę Chrome WebU Chrome?
- 29. Uzyskaj NSData prosto z AFNetworking, zamiast pozwalać mu konwertować na UIImage
- 30. Jak wziąć plus zaloguj zmienną
Przez przypadek, czy ktoś ląduje usłyszeć przez google (jak ja) i szukasz dodaniem ramki do UIImageView, poszukaj odpowiedzi przez @mclin na dole. Działa świetnie! –