Преобразовать класс изображения из RGBX_8888 в RGBA_8888 или получить значение rgb из RGBX_8888

Я разрабатываю приложение, которое делает снимок экрана других приложений.

когда я разрабатываю его с помощью устройства Android, код ниже работает.

         mImageReader = ImageReader.newInstance(mWidth, mHeight, PixelFormat.RGBA_8888, 5);

но код не работает в плеере приложений для Android для ПК (проигрыватель приложений momo), потому что PixelFormat.RGBA_8888 не подходит для проигрывателя приложений momo.

поэтому я изменил PixelFormat.RGBA_8888 на PixelFormat.RGBX_8888

Несмотря на то, что код работает правильно, приведенный ниже код не работает, потому что формат пикселя изменен.

          Image img = null;
                        try {
                            int format = reader.getImageFormat();
                            Log.v(TAG, "format" + format);
                            img = reader.acquireLatestImage();

                            if (img != null) {
                                Image.Plane[] planes = img.getPlanes();
                                if (planes[0].getBuffer() == null) {
                                    return;
                                }
                                int width = img.getWidth();
                                int height = img.getHeight();
                                int pixelStride = planes[0].getPixelStride();
                                int rowStride = planes[0].getRowStride();
                                int rowPadding = rowStride - pixelStride * width;
                                byte[] newData = new byte[width * height * 4];

                                int offset = 0;
                                bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
                                //bitmap = Bitmap.createBitmap(bitmap1, mCheckWidthMin, mCheckHeightMin, mGapWidth, mGapHeight);

                                ByteBuffer buffer = planes[0].getBuffer();
                                for (int i = 0; i < width; ++i) {
                                    for (int j = 0; j < height; ++j) {
                                        int pixel = 0;

                                        pixel |= (buffer.get(offset) & 0xff) << 16;     // R
                                        pixel |= (buffer.get(offset + 1) & 0xff) << 8;  // G
                                        pixel |= (buffer.get(offset + 2) & 0xff);       // B
                                        pixel |= (buffer.get(offset + 3) & 0xff) << 24; // A
                                        bitmap.setPixel(j, i, pixel);
                                        offset += pixelStride;

                                        //else  Log.v(TAG, "Attacking");
                                        //if ( i <= mCheckWidthMax && i >= mCheckWidthMin && j  >= mCheckHeightMin && j <= mCheckHeightMax) {
                                        if ( i <= 171 && i >= 164 && j  >= 236 && j <= 241) {
                                            if(!isAttacked){
                                                checkAttack(pixel, i, j);
                                            }
                                        }
                                        //if ( i == 169 && j == 240) checkAttack(pixel, i, j);

                                    }
                                    offset += rowPadding;
                                }

Я думаю, что простой способ заставить его работать - это изменить формат изображения с RGBX на RGBA.

есть ли способ изменить пиксельный формат?

или как я могу получить значение RGB из PixelFormat.RGBX_8888?

Пожалуйста, помогите и сэкономьте мое время.

благодарю вас!

0 ответов

Другие вопросы по тегам