Eclipse SWT ImageData getPixel возвращает разные значения для Windows против Ma c OSX - PullRequest
0 голосов
/ 31 марта 2020

У меня проблемы с прозрачностью.

Я использую фрагмент, предоставленный в { ссылка }, но пока на Windows работает, на Ма c это не так.

При дальнейшем исследовании, по-видимому, будет значение, возвращаемое из getPixel.

Возьмите приведенный ниже пример, используя прозрачное изображение размером 1x1 пикселей, которое я создал.

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;

import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;

public class ImageTest {
    public static void main(final String[] args) throws MalformedURLException, IOException {
    try (InputStream stream = new URL("https://i.imgur.com/BFlkniE.png").openStream()) {
        final Path path = Files.createTempFile(null, ".png");
        Files.copy(stream, path, StandardCopyOption.REPLACE_EXISTING);

        final ImageDescriptor element = ImageDescriptor.createFromFile(null, path.toString());

        final Image image = element.createImage();
        final ImageData imageData = image.getImageData();

        System.out.println(imageData.getPixel(0, 0));
    }
    }
}

На Windows вывод 0, на Ма c это 16711680. В чем причина?

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Значение, возвращаемое ImageData.getPixel, не обязательно является значением RGB, это просто значение для текущей таблицы цветов. Вы должны использовать PaletteData в ImageData, чтобы получить значение RGB:

RGB rgb = imageData.palette.getRGB(imageData.getPixel(0, 0));
0 голосов
/ 31 марта 2020

Это происходит потому, что вы открываете InputStream, а затем полностью игнорируете его и вместо этого создаете ImageDescriptor из временного файла.

В соответствии с документацией Files.createTempFile() этот временный файл пуст, поэтому попытка создать образ из него гарантированно завершится неудачей, независимо от того, какая у вас операционная система.

Видимо, Реализация ImageDescriptor.createFromFile() ведет себя по-разному между двумя операционными системами в ошибочной ситуации при попытке прочитать изображение из пустого файла.

Я предполагаю, что в обоих случаях они пытаются действовать в якобы терпимый к ошибкам способ, молчаливый сбой вместо выдачи исключения. Однако базовые операционные системы, по-видимому, выходят из строя немного по-разному, поэтому инициализация ImageDescriptor заканчивается неполным по-разному.

Если вам кажется, что он работает под Windows, то это либо из-за чистого совпадения, или, что более вероятно, вы не определяете правильно, провал это или нет. Вы, похоже, считаете, что значение нулевого пикселя, возвращаемое под windows, указывает на успех; Я не был бы так уверен в этом.

...