2012-03-12 31 views
6

Tại sao tôi cần điều này?Nhận và thiết lập giá trị RGB/RGBA của pixel trong CCSprite (cocos2d-x)

Về cơ bản, tôi cần phải biến một hình ảnh màu thành màu xám. Bao gồm một phiên bản màu xám của hình ảnh có thể là một giải pháp, nhưng không gian là chặt chẽ trong tình hình của tôi - Tôi không muốn APK của tôi quá lớn. Bên cạnh đó, tôi cũng muốn làm việc trên các pixel cho một số hiệu ứng. Một lần nữa, điều này là làm cho APK nhỏ hơn.

Tôi đã tìm thấy getPixel setPixel from CCTexture2DGetting image's pixel RGBA, nhưng tôi muốn một cái gì đó đơn giản hơn.

Mọi trợ giúp đều được đánh giá cao.

Cảm ơn bạn!

Trả lời

7

Đây là giải pháp của tôi dành cho bạn:

1.First tạo ra một phiên bản CCImage hình ảnh của bạn:

I) từ file:

CCImage *img= new CCImage(); 
img->initWithImageFile("colors.png"); 

II) Từ Sprite:

  • II.1) CCSprite -> RenderTexture2D

  • II.2) RenderTexture2D -> CCImage (CCImage *testImage = RenderText2D->newCCImage();)

2.Then Bạn có thể làm những gì bạn cần:

CCImage *img= ... // make CCImage from CCSprite 
    int x=3; 
    if(img->hasAlpha()) 
     x=4; 

    unsigned char *data = new unsigned char[img->getDataLen()*x]; 
    data = img->getData(); 
    // [0][0] => Left-Top Pixel ! 
    // But cocos2d Location Y-axis is Bottom(0) to Top(max) 

    for(int i=0;i<img->getWidth();i++) 
    { 
     for(int j=0;j<img->getHeight();j++) 
     { 
      unsigned char *pixel = data + (i + j * img->getWidth()) * x; 

      // You can see/change pixels' RGBA value(0-255) here ! 
      unsigned char r = *pixel; 
      unsigned char g = *(pixel + 1); 
      unsigned char b = *(pixel + 2) ; 
      unsigned char a = *(pixel + 3); 
     } 
    } 

3.Sau đó, chuyển đổi thành texture_2D

//CCImage -> Texture2d 
    texture_2D= new CCTexture2D(); 
    texture_2D->initWithImage(img); 

4.Và cuối cùng quay lại CCSprite

CCSprite *result= CCSprite::createWithTexture(texture_2D); 
+0

Tôi hiểu cách bạn có thể thấy giá trị rgba, vì bạn đang đặt char r = * pixel. Nhưng làm thế nào để bạn thay đổi giá trị của pixel? Tôi hơi bối rối về những gì bạn đang làm với các con trỏ. Bạn có thể giải thích ? –

+1

@John Sure. Nó gần như tương tự. Như bạn đã hiểu, chúng ta có thể truy cập giá trị 'R' của mỗi pixel bằng cách sử dụng con trỏ' * pixel'. Đây là quyền truy cập Đọc ('xxx = * pixel') và Ghi (' * pixel = xxx'). (sử dụng '* (pixel + 1)' cho 'G' và vân vân) – Emadpres

+0

Bạn không bị rò rỉ bộ nhớ bằng cách thực hiện * dữ liệu = mới chưa ký ..... và sau đó trong dòng tiếp theo làm dữ liệu = img-> getData()? –

0

Điều này có thể được thực hiện theo một vài cách. Những gì tôi đã làm trong quá khứ là chỉ cần gọi setColor trên sprite cho một số màu gần với những gì bạn đang tìm kiếm. Điều đó đã làm việc cho mục đích của tôi.

my_sprite.setColor (ccc3 (128, 128, 128));

Một giải pháp (thêm kỹ lưỡng và chính xác): how to implement grayscale rendering in OpenGL?

+0

Tôi biết setColor(), nhưng đó không phải là điều tôi muốn. Cảm ơn bạn đã liên kết! –

Các vấn đề liên quan