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 ^__^.