В Java, как Вы пишете java.awt.image. BufferedImage в 8-разрядный png файл?

Я могу получить разрешение.

Я использовал onNodeSelect api из Treenode. По щелчку узла я просто проверяю, есть ли у узла дочерний узел или нет. Если они не имеют, я получаю данные последнего дочернего узла, используя event.node.data, а затем вызываю fuction и возвращаюсь к родителю и получаю данные родителя.

 nodeSelect(event) {
    if(!event.node.children) {
      this.signalenCodeNode = event.node.data
      this.getParentDetails(event.node)
    }
  }


  getParentDetails(node: TreeNode) {
    if(node.parent){
      this.signalenVestigingNode= node.parent.data
       if(node.parent.parent){
         this.signalenBrin= node.parent.parent.data
       }
    }
  }

HTML :

<h3 class="first">Basic</h3>
<p-treeTable [value]="data" selectionMode="single" [(selection)]="selectedNode" (onNodeSelect)="nodeSelect($event)">
  <ng-template pTemplate="body" let-rowNode let-rowData="rowData">
    <tr >
      <td [ttSelectableRow]="rowNode" >
        <p-treeTableToggler [rowNode]="rowNode"></p-treeTableToggler>
        <span>{{ rowData[_object.keys(rowData)[0]] }} </span>
      </td>
      <td>{{rowData.aantalPersonen}}</td>
    </tr>
  </ng-template>
</p-treeTable>
8
задан 5 November 2008 в 20:17
поделиться

4 ответа

Сборка в imageio png устройство записи запишет 32 бита png файлы на всех платформах, на которых я использовал его, каково исходное изображение. Необходимо также знать, что многие люди жаловались, что получающееся сжатие намного ниже, чем, что возможно с png форматом. Существует несколько независимых png библиотек, доступных, которые позволяют Вам указывать точный формат, но у меня на самом деле нет опыта ни с одним из них.

4
ответ дан 5 December 2019 в 22:21
поделиться

Я нашел ответ относительно того, как преобразовать RGBA в Индексируемый здесь: http://www.eichberger.de/2007/07/transparent-gifs-in-java.html

Однако получающийся 8-разрядный png файл только имеет 100%-ю или 0%-ю прозрачность. Вы могли, вероятно, настроить массивы IndexColorModel, но мы решили сделать сгенерированный файл (что было маской наложения) в лежание в основе jpg, и используйте то, что было статической основой как прозрачным наложением.

1
ответ дан 5 December 2019 в 22:21
поделиться

Это - интересный вопрос... Поздно, я буду экспериментировать завтра. Я сначала попытаюсь использовать BufferedImage. TYPE_BYTE_INDEXED (возможно, после рисования), чтобы видеть, достаточно ли Java умен для генерации PNG на 8 битов.
Или возможно некоторая библиотека изображений может позволить это.

[РЕДАКТИРОВАНИЕ] Несколько лет спустя... На самом деле я сделал код в то время, но забыл обновлять этот поток... Я использовал код, на который указывает Kat с небольшим улучшением на обработке прозрачности и сохранении в формате PNG вместо формата Gif. Это работает в создании 8-разрядного файла PNG с бескомпромиссной прозрачностью.

Можно найти файл эксплуатационного испытания по http://bazaar.launchpad.net/~philho/+junk/Java/view/head:/Tests/src/org/philhosoft/tests/image/AddTransparency.java с помощью моего класса ImageUtil.

Так как код не является настолько большим для пользы потомства, я отправляю его здесь без JavaDoc для сохранения некоторых строк.

public class ImageUtil
{
  public static int ALPHA_BIT_MASK = 0xFF000000;

  public static BufferedImage imageToBufferedImage(Image image, int width, int height)
  {
    return imageToBufferedImage(image, width, height, BufferedImage.TYPE_INT_ARGB);
  }

  public static BufferedImage imageToBufferedImage(Image image, int width, int height, int type)
  {
    BufferedImage dest = new BufferedImage(width, height, type);
    Graphics2D g2 = dest.createGraphics();
    g2.drawImage(image, 0, 0, null);
    g2.dispose();
    return dest;
  }

  public static BufferedImage convertRGBAToIndexed(BufferedImage srcImage)
  {
    // Create a non-transparent palletized image
    Image flattenedImage = transformTransparencyToMagenta(srcImage);
    BufferedImage flatImage = imageToBufferedImage(flattenedImage,
        srcImage.getWidth(), srcImage.getHeight(), BufferedImage.TYPE_BYTE_INDEXED);
    BufferedImage destImage = makeColorTransparent(flatImage, 0, 0);
    return destImage;
  }

  private static Image transformTransparencyToMagenta(BufferedImage image)
  {
    ImageFilter filter = new RGBImageFilter()
    {
      @Override
      public final int filterRGB(int x, int y, int rgb)
      {
        int pixelValue = 0;
        int opacity = (rgb & ALPHA_BIT_MASK) >>> 24;
        if (opacity < 128)
        {
          // Quite transparent: replace color with transparent magenta
          // (traditional color for binary transparency)
          pixelValue = 0x00FF00FF;
        }
        else
        {
          // Quite opaque: get pure color
          pixelValue = (rgb & 0xFFFFFF) | ALPHA_BIT_MASK;
        }
        return pixelValue;
      }
    };

    ImageProducer ip = new FilteredImageSource(image.getSource(), filter);
      return Toolkit.getDefaultToolkit().createImage(ip);
  }

  public static BufferedImage makeColorTransparent(BufferedImage image, int x, int y)
  {
    ColorModel cm = image.getColorModel();
    if (!(cm instanceof IndexColorModel))
      return image; // No transparency added as we don't have an indexed image

    IndexColorModel originalICM = (IndexColorModel) cm;
    WritableRaster raster = image.getRaster();
    int colorIndex = raster.getSample(x, y, 0); // colorIndex is an offset in the palette of the ICM'
    // Number of indexed colors
    int size = originalICM.getMapSize();
    byte[] reds = new byte[size];
    byte[] greens = new byte[size];
    byte[] blues = new byte[size];
    originalICM.getReds(reds);
    originalICM.getGreens(greens);
    originalICM.getBlues(blues);
    IndexColorModel newICM = new IndexColorModel(8, size, reds, greens, blues, colorIndex);
    return new BufferedImage(newICM, raster, image.isAlphaPremultiplied(), null);
  }
}
1
ответ дан 5 December 2019 в 22:21
поделиться

Спасибо за ответ я собирался попробовать TYPE_BYTE_INDEXED с IndexColorModel и может все еще, но если ImageIO выписывает 32-разрядный невнимательный, кажется, что я могу тратить впустую свое время там.

Изображение, которое я пытаюсь выписать, может быть очень большим (до 8000x4000), но является просто простой маской для изображения внизу, так будет только иметь прозрачный серый на ~30% и 100%-е прозрачное очертание. Я использовал бы GIF, но IE6, кажется, испытывает затруднения отобразить то, настолько большое.

Это только сгенерировано однажды и на внутреннем экране типа установки, таким образом, производительность не является проблемой также, но это действительно должно быть сделано в рамках кода Java а не офлайновой утилитой.

Библиотеками, которые Вы указали, можно было бы пользоваться для преобразования его при записи... Я собираюсь пойти, проверяют это.

Если у кого-либо есть лучший путь, сообщите мне!!

Спасибо!

0
ответ дан 5 December 2019 в 22:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: