2010-07-08 19 views
5

Merhaba arkadaşlar, java özellikli cep telefonları için bir j2ME oyunu üzerinde çalışıyorum. Aşağıdaki yöntemi ile şeffaf PNG ölçeğe çalışılıyor:Bir PNG'yi yeniden ölçeklendirmek için özel yöntem saydamlığı kaybediyor

// method derived from a Snippet from http://snippets.dzone.com/posts/show/3257 
// scales an image according to the ratios given as parameters 

private Image rescaleImage(Image image, double XRatio, double YRatio) 
{ 
    // the old height and width 
    int sourceWidth = image.getWidth(); 
    int sourceHeight = image.getHeight(); 

    // what the new height and width should be 
    int newWidth = (int)(XRatio * sourceWidth); 
    int newHeight = (int)(YRatio * sourceHeight); 

    Image newImage = Image.createImage(newWidth, newHeight); 
    Graphics g = newImage.getGraphics(); 

    for (int y = 0; y < newHeight; y++) 
    { 
     for (int x = 0; x < newWidth; x++) 
     { 
      g.setClip(x, y, 1, 1); 
      int dx = (x * sourceWidth)/newWidth; 
      int dy = (y * sourceHeight)/newHeight; 
      g.drawImage(image, (x - dx), (y - dy), Graphics.LEFT | Graphics.TOP); 
     } 
    } 
    return Image.createImage(newImage); 
} 

Bu doğru görüntüyü ölçekler, ne yazık ki yöntemiyle döndürülen görüntü ile şeffaflığı kaybediyor gibi görünüyor. Bu kavramlara oldukça yeniyim ve herhangi bir yardım çok takdir edilecek! 'un java özellikli bir mobil cihazda düzgün bir şekilde görüntülenmesi için, yeniden boyutlandırmanın herhangi bir görüntü düzenleyicide değil kodda yapılması gerekir.

Şimdiden teşekkürler!

cevap

4

Bu geniş kapsamlı ve çözülmemiş sorunlara çözüm arayan herkese teşekkürler. http://willperone.net/Code/codescaling.php

'da harika bir çözüm bulmayı başardım. CreateRGBImage parametresindeki "false" değerini true olarak değiştirin. Bu, her bir pikselin yüksek sıra bitlerini alfa değerleri olarak işlemek için yöntemi işaretler. İşte benim uygulamam, yukarıdaki orijinal bağlantıdan çok bir değişiklik değil.

XRatio ve YRatio, tuval başlatıldığında sabit olarak bildirilir, burada XRatio = this.getWidth() (geçerli telefonun ekran genişliği) orijinal arka plan görüntüsü genişliğinize bölünür ve YRatio ile getHeight()/orijinal arka plan resmi yükseklik.

// RESCALEIMAGE 
// scales an image according to the ratios given as parameters 
// derived from http://willperone.net/Code/codescaling.php 

public static Image rescaleImage(Image original, double XRatio, double YRatio) 
{ 
    // the original width and height 
    int originalWidth = original.getWidth(); 
    int originalHeight = original.getHeight(); 

    // the target width and height 
    int newWidth = (int)(XRatio * originalWidth); 
    int newHeight = (int)(YRatio * originalHeight); 

    // create and fill the pixel array from the original image 
    int[] rawInput = new int[originalHeight * originalWidth]; 
    original.getRGB(rawInput, 0, originalWidth, 0, 0, originalWidth, originalHeight); 

    // pixel array for the target image 
    int[] rawOutput = new int[newWidth*newHeight]; 

    // YD compensates for the x loop by subtracting the width back out 
    int YD = (originalHeight/newHeight) * originalWidth - originalWidth; 
    int YR = originalHeight % newHeight; 
    int XD = originalWidth/newWidth; 
    int XR = originalWidth % newWidth; 
    int outOffset= 0; 
    int inOffset= 0; 

    for (int y = newHeight, YE = 0; y > 0; y--) 
    { 
     for (int x = newWidth, XE = 0; x > 0; x--) 
     { 
      rawOutput[outOffset++] = rawInput[inOffset]; 

      inOffset += XD; 
      XE += XR; 

      if (XE >= newWidth) 
      { 
       XE -= newWidth; 
       inOffset++; 
      } 
     } 

     inOffset += YD; 
     YE += YR; 

     if (YE >= newHeight) 
     { 
      YE -= newHeight; 
      inOffset += originalWidth; 
     } 
    } 
    return Image.createRGBImage(rawOutput, newWidth, newHeight, true); 
} 
1

O muhtemelen bir. Yapabilecekleriniz alfa olanları işlemek için ekstra alfa eklemektir, böylece olası alfa değerlerini korurlar.

Temel olarak, her pikselin kontrol edilmesi, alfa'nın olup olmadığına bakın, eğer varsa, yeniden boyutlandırılan görüntüde olup olmayacağını kontrol edin, eğer varsa, alfa ile uygulayın, yoksa, atın.

+0

Teşekkürler Yonathan. Aralarında ARGB dizisini işlemek için bir ölçekleme algoritması ile birlikte Image.GetRGB() ve Image.createRGBImage() kullanmayı deniyorum. Bana şans dile :) – jbabey

+0

ARGB yaklaşımı hakkında güncelleme: Ölçekleme oranlarının genellikle tamsayı değil, saf piksel dizisi manipülasyonunu biraz daha zor hale getirmesi dışında, oldukça iyi çalışır. – jbabey