2012-08-02 42 views
3

效果所以我一直在寫了大量的圖像處理代碼最近只用核心顯卡,我已經取得了相當操縱的顏色數工作的過濾器,適用於混合,模糊和類似的東西。但我無法寫一個過濾器,以一個點狀化效果應用到這樣一個形象:核芯顯卡點狀化的CGImage

pointillize

我想要做的就是一個像素的顏色,並用這種顏色填充的橢圓形,循環顯示圖像,並在這裏每隔幾個像素做這個代碼:

編輯:這裏是我的新代碼這次它只是在圖像的底部繪製幾個小圓圈我是否正確地像你說的?

-(UIImage*)applyFilterWithAmount:(double)amount { 

CGImageRef inImage = self.CGImage; 
CFDataRef m_dataRef = CGDataProviderCopyData(CGImageGetDataProvider(inImage)); 
UInt8* m_pixelBuf = (UInt8*)CFDataGetBytePtr(m_dataRef); 

int length = CFDataGetLength(m_dataRef); 

CGContextRef ctx = CGBitmapContextCreate(m_pixelBuf, 
            CGImageGetWidth(inImage), 
            CGImageGetHeight(inImage), 
            CGImageGetBitsPerComponent(inImage), 
            CGImageGetBytesPerRow(inImage), 
            CGImageGetColorSpace(inImage), 
            CGImageGetBitmapInfo(inImage)); 

int row = 0; 
int imageWidth = self.size.width; 

if ((row%imageWidth)==0) { 
    row++; 
} 

int col = row%imageWidth; 

for (int i = 0; i<length; i+=4) { 
    //filterPointillize(m_pixelBuf, i, context); 

    int r = i; 
    int g = i+1; 
    int b = i+2; 

    int red = m_pixelBuf[r]; 
    int green = m_pixelBuf[g]; 
    int blue = m_pixelBuf[b]; 

    CGContextSetRGBFillColor(ctx, red/255, green/255, blue/255, 1.0); 
    CGContextFillEllipseInRect(ctx, CGRectMake(col, row, amount, amount)); 
} 

CGImageRef imageRef = CGBitmapContextCreateImage(ctx); 
CGContextRelease(ctx); 
UIImage* finalImage = [UIImage imageWithCGImage:imageRef]; 
CGImageRelease(imageRef); 
CFRelease(m_dataRef); 
return finalImage; 

}

+0

CMD + Z通常是回憶過去所做事情的方法...... – CodaFi 2012-08-02 05:30:10

+0

是的,我運行了代碼,之後撤消選項不可用 – 2012-08-02 05:40:50

回答

1

一個問題,我看到了蝙蝠的權利是您正在使用的光柵單元數量爲你的X和Y原點兩者。這種配置中的柵格僅僅是單維線。您可以根據柵格圖像的寬度計算第二維。這可以解釋爲什麼你有一條線。

另一件事:似乎你正在讀取圖像的每個像素。你不想跳過你試圖繪製的橢圓的寬度的像素嗎?

接下來的事情看起來很可疑的是,我認爲你應該創建你在圖畫的背景。此外,你不應該叫:

CGContextRef contextRef = UIGraphicsGetCurrentContext(); 
CGContextSaveGState(contextRef); 

CGContextRestoreGState(contextRef); 

內循環。

編輯:

一個進一步的觀察:你讀的RGB值是0-255,和CGContextSetRGBFillColor功能預計值是0.f之間 - 1.f.這可以解釋你爲什麼變白。所以,你需要255分:

CGContextSetRGBFillColor(contextRef, red/255, green/255, blue/255, 1.0); 

如果您有任何問題,請不要猶豫,問!

編輯2:

要計算行,首先聲明循環外的行計數器:

int row = 0; //declare before the loop 

int imageWidth = self.size.width; //get the image width 

if ((i % imageWidth) == 0) { //we divide the cell number and if the remainder is 0 
          //then we want to increment the row counter 
    row++; 
} 

我們也可以使用MOD來計算當前列:

int col = i % imageWidth; //divide i by the image width. the remainder is the col num 

編輯3: 你必須把它放在for循環中:

if ((row%imageWidth)==0) { 
    row++; 
} 

int col = row%imageWidth; 

而且,我忘了之前提到,要基於列和行0(這是你想要的),你需要從圖像尺寸減去1:

int imageWidth = self.size.width - 1; 
+0

我在考慮關於不包括y維度的同樣的事情。你能給我一個關於如何分別遍歷列和行的提示嗎?是的,我會跳過我還沒有添加的像素。對啊,我忘了255除以我在其他過濾器,但似乎忘記了這一個。謝謝!一旦我得到這個工作,我會給你你的五十個聲望點。 – 2012-08-06 05:37:48

+0

請參閱編輯2. – 2012-08-06 22:29:43

+0

好吧我根據您所說的檢查了我的編輯而改變了一點。 – 2012-08-07 00:53:30