0

Netbeans を IDE として使用して、j2me ベースのプロジェクトを作成しました。ここで、このプロジェクトのリソース (アイコン、画像) を難読化して、画像の名前または外観を変更したいと考えています。これを行うにはどうすればよいですか?

4

1 に答える 1

1

画像ファイル名を拡張子なしで、1 文字または 2 文字のみに変更できます。次に、元の名前の代わりにこれらの新しい名前を使用するようにコードを変更します。
画像ファイルが PNG の場合、ビルド中に PLTE チャンクを間違った値に変更し、実行中に修正できます。
Image クラスには簡単に色を変更するメソッドがありません。回避策として、getRGB メソッドを呼び出して、rgbData 配列を反復処理することができます。より良い方法は、ファイルの内容を読み取り、パレット バイトを変更し、結果のデータからイメージを作成することです。まず、ヘルパー メソッドを作成して、InputStream 全体を読み取り、その内容を含むバイト配列を返します。

private byte [] readStream (InputStream in) throws IOException
{
  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  byte [] buff = new byte [1024];
  int size = in.read(buff);

  while (size >= 0) {
    baos.write(buff, 0, size);
    size = in.read(buff);
  }

  return baos.toByteArray();
}

次に、バイト配列内のパレット チャンクの場所を見つける必要があります。別のヘルパー メソッドを次に示します。

// return index where P of PLTE is found at buff array or -1
private int getPLTEIndex (byte [] buff) {
  int i = -1;
  // 4 == "PLTE".size()
  if (buff != null && buff.length >= 4) {
    boolean foundPalete = false;
    boolean endOfBuff = false;
    do {
      i++;
      foundPalete = buff[i] == 'P'
              && buff[i +1] == 'L'
              && buff[i +2] == 'T'
              && buff[i +3] == 'E';
      endOfBuff = (i +4 >= buff.length);
    } while (!foundPalete && !endOfBuff);
    if (endOfBuff) {
      i = -1;
    }
  }
  return i;
}

最後に、カラー タイプ 3 の PNG ファイルのパレットから色を変更する方法:

private byte [] setRGBColor (byte [] buff, int colorIndex, int colorNewValue) {
  int i = getPLTEIndex(buff);
  if (i >= 0) {
    i += 4; // 4 == "PLTE".size()
    i += (colorIndex * 3); // 3 == RGB bytes
    if (i + 3 <= buff.length) {
      buff[i] = (byte) (((colorNewValue & 0x00ff0000) >> 16) & 0xff);
      buff[i +1] = (byte) (((colorNewValue & 0x0000ff00) >> 8) & 0xff);
      buff[i +2] = (byte) ((colorNewValue & 0x000000ff) & 0xff);
    }
  }
  return buff;
}

以下は、すべてのメソッドの使用方法のサンプルです。

InputStream in = getClass().getResourceAsStream("/e");
try {
  byte [] buff = readStream(in);
  Image original = Image.createImage(buff, 0, buff.length);
  buff = setRGBColor(buff, 0, 0x00ff0000); // set 1st color to red
  buff = setRGBColor(buff, 1, 0x0000ff00); // set 2nd color to green
  Image updated = Image.createImage(buff, 0, buff.length);
} catch (IOException ex) {
    ex.printStackTrace();
}

http://smallandadaptive.blogspot.com.br/2010/08/manipulate-png-palette.htmlに見られるように

于 2013-02-04T00:07:15.187 に答える