2013-04-13 32 views
3

假設我有一個100x100的圖像。我想將圖像放到500x500的較大的畫布上。使用GPU(可能爲CIFilters)在不使用圖像上下文的情況下將圖像放置在較大的畫布大小上

我目前的做法是使用UIGraphics創建一個上下文,然後將圖像繪製到上下文中。

UIGraphics.BeginImageContext(....); 
ImageView.Draw (....); 

那偉大工程,但它不是那麼快,我想它是我在做什麼。我注意到CIFilters非常快。 有沒有一種方法可以將圖像放置在使用CIFilters的較大畫布上,或使用GPU而不是CPU的另一種方法?我已經嘗試與CIFilters CICrop和CIPerspectiveTransform,但我似乎無法讓我期望的結果...

enter image description here
原始圖片100x100的

enter image description here

在500×500我想要的結果圖像。我只是想使用CIFilters或某些GPU操作來拍攝圖像並增加畫布大小。

我嘗試使用CICrop做一個「反向裁剪」,但沒有奏效。注意我指定了CIVector的大小爲500x500,即使圖像本身是100x100,結果圖像完全忽略了額外的空間並關閉了。這裏是我的代碼:

 CICrop crop = new CICrop(); 
     crop.Image = ImageView.Image.CGImage; 
     crop.Rectangle = new CIVector(0, 0, 500, 500); 
     ImageView.Image = new UIImage(crop.OutputImage); 
     Console.WriteLine("ImageView.Image.size = "+ ImageView.Image.Size); 

回答

3

裁剪過濾器不會達到您的目的 - 您不能用裁剪過濾器縮放輸入圖像的大小。來自維基百科:剪裁指的是去除圖像的外部部分,以改善構圖,突出主題或改變縱橫比。

你需要的是一個比例過濾器。要用CoreImage實現這一點,你需要做這樣的事情:

CIImage *input = [CIImage imageWithCGImage: ImageView.Image.CGImage]; // input image is 100 X 100 
CGAffineTransform transform = CGAffineTransformMakeScale(5.0f, 5.0f); // Scale by 5 times along both dimensions 
CIImage *output = [input imageByApplyingTransform: transform]; 
// output image is now 500 X 500 
+0

我明白作物是如何工作的。我只是試圖想出一個巧妙的方式,通過使用CIFilter來更改圖像的畫布大小,因爲CI濾鏡非常快!規模不會'實際上做我想要實現的。縮放會縮放整個圖像,我希望圖像本身保持相同的大小/尺寸,但只能增加圖層(也就是爲圖像添加空白或空白..)將其視爲在photoshop中打開100x100圖像,然後將Canvas大小更改爲500x500。 – LampShade

+0

@LampShade - 對不起,我想錯誤地理解你的問題!我認爲你可以通過源代碼合成過濾器實現你想要的功能(https://developer.apple.com/library/mac/#documentation/graphicsimaging/reference/CoreImageFilterReference/Reference/reference.html#// apple_ref/DOC /濾波器/ CI/CISourceOverCompositing)。源過濾背景圖像= [CIImage imageWithColor:white];輸入圖像=您的100X100圖像;並將此過濾器鏈接到500X500農作物過濾器。裁剪過濾器的輸出應該是你在找什麼? – terapixel

+0

聽起來好像應該可以工作,但是我一直在努力的是如何將100x100圖像準確定位在我想要的位置?在源過濾之後,100x100圖像的位置始終爲X-0,Y-0。如果我想讓它成爲X-50,Y-152?我似乎無法定位......任何想法?不要擔心誤會! – LampShade

相關問題