2012-01-16 3 views
0

Я новичок в Cocoa, у меня есть несколько сомнений относительно NSImage.Изменение границ происхождения + обрезка изображения

Question1:

Изменение границ происхождения изображения, кажется, не имеют никакого эффекта. Я ожидал, что изображение будет выведено из вновь созданного источника, но это, похоже, не так. Я что-то упускаю ?

код:

NSImage* carImage = [NSImage imageNamed:@"car"]; 

[self.imageView setImage:carImage]; 

//Following line has no effect: 
self.imageView.bounds = CGRectMake(self.imageView.bounds.origin.x + 100, self.imageView.bounds.origin.y, self.imageView.bounds.size.width,self.imageView.bounds.size.height); 

Примечание: ImageView является IBOutlet

Вопрос2:

Я пытался обрезать изображение, но это, кажется, не обрезать изображение, я вижу полное изображение. Что мне не хватает?

код:

NSRect sourceRect = CGRectMake(150, 25, 100, 50); 
NSRect destRect = CGRectMake(0, 0, 100, 50); 

NSImage* carImage = [NSImage imageNamed:@"car"]; 

[carImage drawInRect:destRect fromRect:sourceRect operation:NSCompositeSourceOver fraction:1.0]; 

[self.imageView setImage:carImage]; 

Благодаря

ответ

2

Изменение границ происхождения изображения, кажется, не имеют никакого эффекта. ...

//Following line has no effect: 
self.imageView.bounds = CGRectMake(self.imageView.bounds.origin.x + 100, self.imageView.bounds.origin.y, self.imageView.bounds.size.width,self.imageView.bounds.size.height); 

Это вид в образ, а не образ.

Эффект изменения границ вида зависит от того, что вид делает для рисования. Эффективно это означает, что вы не должны изменять границы представления, которое не является экземпляром класса вида, который вы создали, поскольку вы не можете точно предсказать, как NSImageView будет рисовать его изображение (предположительно, поскольку это элемент управления, он включает в себя свою ячейку, но более того, я бы не стал полагаться).

В более общем плане, очень редко можно изменить начало координат вида. Я не помню, чтобы когда-либо это делал, и я не могу придумать причину с моей головы, чтобы сделать это. Изменение размера границ будет масштабироваться, а не обрезать.

Я пытался обрезать изображение, но, похоже, оно не обрезает изображение, я вижу полное изображение. Что мне не хватает?

[carImage drawInRect:destRect fromRect:sourceRect operation:NSCompositeSourceOver fraction:1.0]; 

[self.imageView setImage:carImage]; 

указал изображение рисовать ничего об изображении не меняется. Он не будет «обрезать изображение» таким образом, чтобы изображение впоследствии было меньше или больше. Вы говорите это, чтобы рисовать, не более того.

Следовательно, утверждение после этого устанавливает изображение образа изображения на все изображение, точно так же, как если бы вы не сказали изображению рисовать, потому что говорить об этом нарисовать не имело значения.

То, что говорит изображение для рисования, - это именно то, что он сообщает изображению.Есть только два правильных места, чтобы сделать это:

  1. В между lockFocus и unlockFocus сообщений на представление или изображение (или после установки текущего NSGraphicsContext).
  2. Внутри метода drawRect: вида.

В любом месте, вы не должны указывать какой-либо объект какао для рисования.

Правильный способ обрезать изображение - это создать новое изображение желаемого/скорректированного размера, зафиксировать фокус на нем, вставить в него желаемую часть исходного изображения и разблокировать фокус на новом изображении. Затем у вас будет как оригинальная, так и обрезанная версия.

Еще один правильный способ - создать свой собственный образ изображения, который имеет два свойства: один, обладающий изображением для рисования, а другой - прямоугольник. Когда ему будет предложено нарисовать, этот пользовательский вид подскажет изображению рисовать данный прямоугольник в границах представления. Затем вы всегда держите исходное изображение и просто рисуете только нужный раздел.

+0

Большое спасибо Петру, ваш ответ был действительно полезен !! – user1046037

Смежные вопросы