2010-03-04 41 views
3

我已經問this question Kenny給了我一個很好的答案(非常感謝他),但我仍然對最終實現感到困惑。 所以,問題是 - 如何訪問圖像中某個像素的矩陣。如何創建和應用我已計算的圖像歪斜變換?

我翻譯肯尼的樣品Objective-C的:

- (NSArray *) compute_transform_matrix:(float)X 
     Y:(float)Y 
     W:(float)W 
     H:(float)H 
     x1a:(float)x1a 
     y1a:(float)y1a 
     x2a:(float)x2a 
     y2a:(float)y2a 
     x3a:(float)x3a 
     y3a:(float)y3a 
     x4a:(float)x4a 
     y4a:(float)y4a { 
float y21 = y2a - y1a, y32 = y3a - y2a, y43 = y4a - y3a, y14 = y1a - y4a, y31 = y3a - y1a, y42 = y4a - y2a; 

float a = -H*(x2a*x3a*y14 + x2a*x4a*y31 - x1a*x4a*y32 + x1a*x3a*y42); 
float b = W*(x2a*x3a*y14 + x3a*x4a*y21 + x1a*x4a*y32 + x1a*x2a*y43); 
float c = H*X*(x2a*x3a*y14 + x2a*x4a*y31 - x1a*x4a*y32 + x1a*x3a*y42) - H*W*x1a*(x4a*y32 - x3a*y42 + x2a*y43) - W*Y*(x2a*x3a*y14 + x3a*x4a*y21 + x1a*x4a*y32 + x1a*x2a*y43); 

float d = H*(-x4a*y21*y3a + x2a*y1a*y43 - x1a*y2a*y43 - x3a*y1a*y4a + x3a*y2a*y4a); 
float e = W*(x4a*y2a*y31 - x3a*y1a*y42 - x2a*y31*y4a + x1a*y3a*y42); 
float f = -(W*(x4a*(Y*y2a*y31 + H*y1a*y32) - x3a*(H + Y)*y1a*y42 + H*x2a*y1a*y43 + x2a*Y*(y1a - y3a)*y4a + x1a*Y*y3a*(-y2a + y4a)) - H*X*(x4a*y21*y3a - x2a*y1a*y43 + x3a*(y1a - y2a)*y4a + x1a*y2a*(-y3a + y4a))); 

float g = H*(x3a*y21 - x4a*y21 + (-x1a + x2a)*y43); 
float h = W*(-x2a*y31 + x4a*y31 + (x1a - x3a)*y42); 
float i = W*Y*(x2a*y31 - x4a*y31 - x1a*y42 + x3a*y42) + H*(X*(-(x3a*y21) + x4a*y21 + x1a*y43 - x2a*y43) + W*(-(x3a*y2a) + x4a*y2a + x2a*y3a - x4a*y3a - x2a*y4a + x3a*y4a)); 
return [NSArray arrayWithObjects: 
[NSArray arrayWithObjects: 
    [NSNumber numberWithFloat:a],[NSNumber numberWithFloat:b],[NSNumber numberWithFloat:0],[NSNumber numberWithFloat:c],nil], 
    [NSArray arrayWithObjects: 
    [NSNumber numberWithFloat:d],[NSNumber numberWithFloat:e],[NSNumber numberWithFloat:0],[NSNumber numberWithFloat:f],nil], 
    [NSArray arrayWithObjects: 
    [NSNumber numberWithFloat:0],[NSNumber numberWithFloat:0],[NSNumber numberWithFloat:1],[NSNumber numberWithFloat:0],nil], 
    [NSArray arrayWithObjects: 
    [NSNumber numberWithFloat:g],[NSNumber numberWithFloat:h],[NSNumber numberWithFloat:0],[NSNumber numberWithFloat:i],nil], 
    nil]; 
} 

,並在最開始我創建圖像的位圖 - 「imageBitmap」:

- (void) createImageBitmap{ 
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"Demo.png" ofType:nil]; 
UIImage *img = [UIImage imageWithContentsOfFile:imagePath]; 
CGImageRef image = CGImageRetain(img.CGImage); 

NSUInteger width = CGImageGetWidth(image); 
NSUInteger height = CGImageGetHeight(image); 

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
unsigned char *rawData = malloc(height * width * 4); 
NSUInteger bytesPerPixel = 4; 
NSUInteger bytesPerRow = bytesPerPixel * width; 
NSUInteger bitsPerComponent = 8; 
CGContextRef imageBitmap = CGBitmapContextCreate(rawData, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 
CGColorSpaceRelease(colorSpace); 

CGContextDrawImage(imageBitmap, CGRectMake(0, 0, width, height), image); 
} 

於是,我想,我需要做以下操作:

for(int x=0;x<width;x++){ 
    for(int y=0;x<height;y++){ 
    NSArray* matrixForPoint = [self compute_transform_matrix:x Y:y W:width H:height x1a:0 y1a:0 x2a:width y2a:0 x3a:width y3a:height x4a:0 y4a:height]; 
    // set Matrix for x, y point to "imageBitmap" bitmap, but HOW????????? 
    } 
} 

那麼,如何設置Matrix爲x,y指向「imageBitmap」位圖?

提前感謝

回答

2

肯尼的解決方案爲您提供了產生CATransform3D的手段,你會再申請到的CALayer UIView的或的層承載圖像。您需要爲此變換分配矩陣元素,並使用此處計算的值。我的建議是讓你的-compute_transform_matrix:方法返回一個CATransform3D,並與

CATransform3D skewTransform; 
skewTransform.m11 = a; 
skewTransform.m12 = b; 
skewTransform.m13 = 0; 
skewTransform.m14 = c; 
skewTransform.m21 = d; 
skewTransform.m22 = e; 
skewTransform.m23 = 0; 
skewTransform.m24 = f; 
skewTransform.m31 = 0; 
skewTransform.m32 = 0; 
skewTransform.m33 = 1; 
skewTransform.m34 = 0; 
skewTransform.m41 = g; 
skewTransform.m42 = h; 
skewTransform.m43 = 0; 
skewTransform.m44 = i; 

return skewTransform; 

取代的最後幾行,然後你可以設置這個改變你的層或視圖的達到這個效果歪斜層上。

+0

好的,所以矩陣應用於整個圖層。但如果是這樣,compute_transform_matrix方法中的屬性意味着什麼?據我瞭解:H,W - 圖像高度,寬度; x1a,y1a,x2a ... y4a - 角落的座標;但什麼是X和Y? – Dmitry 2010-03-04 17:37:54

+1

從肯尼的回答是:「要獲得變換爲矩形((X,Y),(W,H))轉換爲任何四邊形((X1A,Y1A),(X2A,Y2A);(X3A,Y3A),( x4a,y4a)),使用此函數(您可能需要轉置):「。看起來(X,Y)是原始圖像的原點座標(可能是(0,0))。 – 2010-03-04 18:26:43