Creer une image avec come info des pixels
Bonjour,
Mon client(mobile phone) demande au serveur des pixels. Le serveur renvoie sous forme HTTP des pixels. Sur le serveur je faisais avec les bonnes initialisations des variables
Code:
1 2 3 4
|
Image image;
source = new MemoryImageSource(width,height,pixels,0,width);
image= Toolkit.getDefaultToolkit().createImage(source); |
A partir de cette image je l'affiche sur le serveur est la qualite est bonne.
En revanche sur le client la qualite est degueulasse. Je m'attendais a un petit deficit de qualite mais a ce point la !
Pour recuperer lles pixels je fais : il y a beaucoup de code donc si vous comprenez pas c'est pas grave. Car normalement cette facon de marche a fait ses preuves pour d'autres images.
J'ai recuperer les pixels de facon differente que je fais d'habitude.
D'habitude je faisais int c=bimage.getRGB(x,y); pour recuperer les pixels.
La methode que j'ai utilise ici est une methode adapte pour recuperer des pixels d'une image 3d. Malheureusement l'image 3d sur le mobile est degueulasse. Vous me suivez ? Bon sauter ce bout de code si vous comprenez pas
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
|
byte[] buf = new byte[65535]; // Must be an even multiple of 3 !!
//int maxB;
//maxB=width*height*samplesPerPixel;
System.out.println("ServerConnection::Do_imageThreeDRequest() :test");
//byte[] buf = new byte[width*height*samplesPerPixel];
int bytesRead=0;
int currentSample=0; // 0=Red, 1=Green, 2=Blue
argb[0] = 0;
do
{
try
{
int n;
while(bis.available() == 0)
{
Thread.yield();
}
//LogClient.LogMessage("bis.available()="+bis.available());
if ((n = bis.read(buf,0,Math.min(65535,bis.available()))) != -1) // Regular blocking read doesn't work on Nokia !!
// if ((n = bis.read(buf,0,Math.min(maxB,bis.available()))) != -1)
{
bytesRead += n;
//LogClient.LogMessage("read "+n+" bytes (+"+bytesRead+" in total)");
for (int i=0 ; i < n ; i++)
{
//System.out.println("pixels = buf["+i+"]= "+buf[i]);
if (samplesPerPixel == 3)
{
// Colour image...separate Red, Green and Blue components
// All Java variables are "bigendian" so it is OK to construct ARGB value like this
argb[currentPixelNo] = (argb[currentPixelNo] << 8) | (buf[i] + 128);
if (++currentSample == 3) // Red -> Green -> Blue...
{
currentSample=0; // ...and Back to Red
if (++currentPixelNo < argb.length)
{
// Zero the next pixel
argb[currentPixelNo] = 0;
}
}
else if (samplesPerPixel == 1)
{
// Monochrome image...Red==Green==Blue
argb[currentPixelNo++] = ((buf[i] + 128) << 16) | ((buf[i] + 128) << 8) | (buf[i] + 128);
}
//beaucoup d'exceptions
}while(bytesRead < contentLength); |
Une fois les pixels recuperer je fais simplement
Code:
1 2 3
|
Image immutableImg = Image.createRGBImage(argb,req.getWidth(),req.getHeight(),false);
argb=null; |
pour recuperer une image qui est malheureusement de mauvaise qualite.
Celui qui a lu jusque la merci !!
C'est un domaine assez specifique je ne m'attends pas a beaucoup de reponses donc merci ceux qui ont l'audace de repondre "!!