2010-02-14 3 views
1

У меня есть изображение .PNG с прозрачным фоном и черным рисунком с черным цветом, как я могу изменить «черный цвет чертежа» на этом изображении на любой цвет, который я хочу программно; с использованием обода 4.5 API? СПАСИБО В ADVANCE ....Как изменить цвет в изображении программным путем?

ответ

2

Я нашел решение, вот оно для тех, кто заинтересован.

Bitmap colorImage(Bitmap image, int color) { 
    int[] rgbData= new int[image.getWidth() * image.getHeight()]; 
    image.getARGB(rgbData, 
        0, 
        image.getWidth(), 
        0, 
        0, 
        image.getWidth(), 
        image.getHeight()); 
    for (int i = 0; i < rgbData.length; i++) { 
     int alpha = 0xFF000000 & rgbData[i]; 
     if((rgbData[i] & 0x00FFFFFF) == 0x00000000) 
      rgbData[i]= alpha | color; 
    } 
    image.setARGB(rgbData, 
        0, 
        image.getWidth(), 
        0, 
        0, 
        image.getWidth(), 
        image.getHeight()); 
    return image; 
} 
+0

Да, это сработает, но оно не изменит цвета, которые даже немного нечерны, что означает, что любое изображение, которое будет сглажено, окажется довольно уродливым. – funkybro

1

Вы можете проанализировать изображение RGB, ищущее черный цвет, и заменить его любым желаемым цветом.

+0

Спасибо Ali .... в следующем посте вы найдете реализацию. –

+0

Добро пожаловать, и хорошая реализация. –

1

Вы можете прочитать свое изображение PNG в байтовый массив и отредактировать палитру палитры. Этот метод подходит только для изображений PNG-8. Это мой код:

 

public static Image createImage(String filename) throws Throwable 
    { 
     DataInputStream dis = null; 
     InputStream is = null; 

     try { 
      is = new Object().getClass().getResourceAsStream(filename); 
      dis = new DataInputStream(is); 

      int pngLength = dis.available(); 
      byte[] png = new byte[pngLength]; 
      int offset = 0; 
      dis.read(png, offset, 4); offset += 4; //‰PNG 
      dis.read(png, offset, 4); offset += 4; //.... 
      while (true) { 
       //length 
       dis.read(png, offset, 4); offset += 4; 
       int length = (png[offset-1]&0xFF) | ((png[offset-2]&0xFF)<<8) | ((png[offset-3]&0xFF)<<16) | ((png[offset-4]&0xFF)<<24); 
       //chunk type 
       dis.read(png, offset, 4); offset += 4; 
       int type = (png[offset-1]&0xFF) | ((png[offset-2]&0xFF)<<8) | ((png[offset-3]&0xFF)<<16) | ((png[offset-4]&0xFF)<<24); 

       //chunk data 
       for (int i=0; i<length; i++) { 
        dis.read(png, offset, 1); offset += 1; 
       } 
       //CRC 
       dis.read(png, offset, 4); offset += 4; 
       int crc = (png[offset-1]&0xFF) | ((png[offset-2]&0xFF)<<8) | ((png[offset-3]&0xFF)<<16) | ((png[offset-4]&0xFF)<<24); 

       if (type == 0x504C5445) { //'PLTE' 
        int CRCStart = offset-4; 
        int PLTEStart = offset-4-length; 

        //modify PLTE chunk 
        for (int i=PLTEStart; i<PLTEStart+length; i+=3) { 
         png[i+0] = ... 
         png[i+1] = ... 
         png[i+2] = ... 
        } 

        int newCRC = crc(png, PLTEStart-4, length+4); 
        png[CRCStart+0] = (byte)(newCRC>>24); 
        png[CRCStart+1] = (byte)(newCRC>>16); 
        png[CRCStart+2] = (byte)(newCRC>>8); 
        png[CRCStart+3] = (byte)(newCRC); 

       } 
       if (offset >= pngLength) 
        break; 
      } 

      return Image.createImage(png, 0, pngLength); 
     } catch (Throwable e) { 
      throw e; 
     } finally { 
      MainCanvas.closeInputStream(dis); 
      MainCanvas.closeInputStream(is); 
     } 
    } 
 
+0

Не могли бы вы объяснить, почему вы увеличиваете смещение? И какова цель параметра смещения? –

+0

«Смещение» - это просто текущая позиция в файле - мы читаем поток и записываем его в массив в текущей позиции. Но этот код 3 года - теперь мне кажется, что было бы лучше прочитать весь файл в массиве, а затем отредактировать этот массив :) –

Смежные вопросы