Foros del Web » Programación para mayores de 30 ;) » Java »

pasar una imagen en forma de bytes entre C++ y java

Estas en el tema de pasar una imagen en forma de bytes entre C++ y java en el foro de Java en Foros del Web. Hola amigos tengo esta duda, resulta que deseo tomar una instantanea del cursor del mouse mediante C++ y pasar la imagen en forma de bytes ...
  #1 (permalink)  
Antiguo 05/08/2009, 08:16
 
Fecha de Ingreso: marzo-2009
Mensajes: 7
Antigüedad: 15 años, 1 mes
Puntos: 0
Pregunta pasar una imagen en forma de bytes entre C++ y java

Hola amigos tengo esta duda, resulta que deseo tomar una instantanea del cursor del mouse mediante C++ y pasar la imagen en forma de bytes a Java, el problema es que cuando lo hago la imagen resultante es nula o invicible, aunque yo hize pruebas y los bytes devueltos no son nulos, solo que la imagen no es pintada, quisiera que alguien me ayudara o me diera algun consejo de que debo hacer y de como buscar informacion sobre esta clase de programacion, mi codigo es el siguiente:

el codigo en C++ es el siguiente, este consigue una imagen del raton y la guarda en un HBITMAP, luego consigo sus bytes y los devuelvo como un tipo JNI:

Código:
JNIEXPORT jbyteArray JNICALL
Java_com_local_Cursor_LCursor_getCursorImage(JNIEnv * env,jobject){
    CURSORINFO      CursorInfo;
    HBITMAP bitmap;
    byte bytes[34*34];
    jbyteArray jarray=env->NewByteArray(34*34);
    CursorInfo.cbSize = sizeof(CursorInfo);
    GetCursorInfo(&CursorInfo);
    //HICON icon=CopyIcon(CursorInfo.hCursor);
    HICON icon=CursorInfo.hCursor;
    bitmap=BitmapFromIcon(icon);
    if(bitmap != NULL)
        GetBitmapBits(bitmap,34*34,&bytes);
        //GetDIBits(NULL,bitmap,0,34*34,&bytes,NULL,DIB_RGB_COLORS);
    if(bytes != NULL){
        env->SetByteArrayRegion(jarray,0,34*34,(const jbyte *)bytes);
        return jarray;
    }
}
luego utilizo java para llamar este codigo remoto y contruir la imagen:


Código:
public static void main(String[] a) {
        byte[] arr = new LCursor().getLCursorImage();
        System.out.println(arr.length);
        //BufferedImage imag= ImageUtils.read(arr);
        Image imag = Toolkit.getDefaultToolkit().createImage(arr);
        ImageIcon icon = null;
        icon = new ImageIcon(img);
        JFrame fr = new JFrame();
        JLabel la = new JLabel(icon);
        la.setBackground(Color.BLUE);
        la.setBounds(0, 0, 500, 500);
        fr.setBounds(0, 0, 500, 500);
        fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fr.getContentPane().setLayout(null);
        fr.getContentPane().setBackground(Color.BLUE);
        fr.getContentPane().add(la);
        fr.setVisible(true);
    }
intente otro codigo que encontre pero no lo entendi, este codigo si me muestra un resultado pero resulta en una imagen negra con unos cuantos pixeles de colores:


Código:
int width = 34;
        int height = 34;

        BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        int[] raw = new int[arr.length * 4 / 3];
        for (int i = 0; i < arr.length / 3; i++) {
            raw[i] = 0xFF000000 |
                    ((arr[3 * i + 0] & 0xFF) << 16) |
                    ((arr[3 * i + 1] & 0xFF) << 8) |
                    ((arr[3 * i + 2] & 0xFF));
        }
        img.setRGB(0, 0, width, height, raw, 0, width);
Cualquier ayuda se les agradecera mucho, mi experiencia en C++ no es muy basta, es mas basica solo que trato de usar funsiones y las busco por internet y trato de entenderlas, cualquier consejo o arreglo a mi codigo seria cool ^__^.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:50.