2016-01-05 91 views
0

我有以下目標C函數意味着將NSBitmapImageRep調整爲指定的大小。NSBitmapImageRep -initWithFocusedViewRect將圖像大小加倍

目前,當處理大小爲2048x1536的圖像並嘗試將其大小調整爲300x225時,此函數將不斷返回大小爲600x450的NSBitmapImageRep。

- (NSBitmapImageRep*) resizeImageRep: (NSBitmapImageRep*) anOriginalImageRep toTargetSize: (NSSize) aTargetSize 
{ 
    NSImage* theTempImageRep = [[[NSImage alloc] initWithSize: aTargetSize ] autorelease]; 
    [ theTempImageRep lockFocus ]; 
    [NSGraphicsContext currentContext].imageInterpolation = NSImageInterpolationHigh; 
    NSRect theTargetRect = NSMakeRect(0.0, 0.0, aTargetSize.width, aTargetSize.height); 
    [ anOriginalImageRep drawInRect: theTargetRect]; 
    NSBitmapImageRep* theResizedImageRep = [[[NSBitmapImageRep alloc] initWithFocusedViewRect: theTargetRect ] autorelease]; 
    [ theTempImageRep unlockFocus]; 

    return theResizedImageRep; 
} 

調試它,我發現theTargetRect是適當的規模,而是調用initWithFocusedRec返回600x450像素(寬(高)x)的位圖

我在一個完整的損失爲什麼這可能會發生。有沒有人有任何見解?

回答

1

您的技術不會產生調整大小的圖像。首先,方法initWithFocusedViewRect:從焦點窗口讀取位圖數據,並用於創建屏幕截圖。

你應該用一個新的NSBitmapImageRep或NSImage創建一個新的圖形上下文,然後你將圖像繪製到上下文中。

這樣的事情。

NSGraphicsContext* context = [NSGraphicsContext graphicsContextWithBitmapImageRep:theTempImageRep]; 

if (context) 
{ 
    [NSGraphicsContext saveGraphicsState]; 
    [NSGraphicsContext setCurrentContext:context]; 

    [anOriginalImageRep drawAtPoint:NSZeroPoint]; 
    [anOriginalImageRep drawInRect:theTargetRect]; 

    [NSGraphicsContext restoreGraphicsState]; 
} 
// Now your temp image rep should have the resized original. 
+0

確定嗎?我繼承了一箇舊的代碼庫(目前在10.7SDK並更新它),所以它們的代碼應該是有效的,除非有API更改。我認爲這只是新的目標C處理位圖像素分辨率的方式發生了變化。 – mosquito242

+0

該代碼來自正在運行的項目。我不認爲那裏有什麼東西不能在10.7上工作,但它肯定能在10.9+上運行 – Jason