سؤال

ولدي صورة بابوا نيو غينيا مع خلفية شفافة والرسم في ذلك مع اللون الأسود، وكيف يمكن أن أغير "الرسم بالألوان الأسود" في هذه الصورة إلى أي لون أريد برمجيا. باستخدام حافة 4.5 API؟ شكرا مقدما ....

هل كانت مفيدة؟

المحلول

ولقد وجدت الحل، ومن هنا بالنسبة لأولئك الذين يهتمون.

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;
}

نصائح أخرى

ويمكنك تحليل رغبس صورة تبحث عن اللون الأسود واستبداله بكل ما اللون الذي ترغب في ذلك.

ويمكنك قراءة صورة 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);
        }
    }

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top