2013-06-24 4 views
14

Я сохраняю изображение подписи как изображение .jpg. Я использую graphic2d, чтобы нарисовать на изображении каждый пиксель подписи (полученный с подписным планшетом), и он отлично работает, но я всегда получаю белый фон. Если я хочу поставить подпись в PDF-документе, границы белого квадрата jpg-изображения охватывают некоторые слова PDF.Сохранить буферизованное изображение с прозрачным фоном

Что я хочу получить, это сохранить изображение в формате jpg с прозрачным фоном, поэтому, когда я помещаю его в PDF, нет слов, покрытых белым фоном изображения, а только линий подписи.

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

// This method refers to the signature image to save 
private RenderedImage getImage() { 

    int width = tabletWidth; 
    int height = tabletHeight; 

    // Create a buffered image in which to draw 
    BufferedImage bufferedImage = new BufferedImage(width, height, 
      BufferedImage.TYPE_INT_RGB); 

    // Create a graphics contents on the buffered image 
    Graphics2D g2d = bufferedImage.createGraphics(); 

    // Draw graphics 
    g2d.setColor(Color.WHITE); 
    g2d.fillRect(0, 0, width, height); 

    drawPoints(Tablet.getPenPoints(), g2d, Color.BLACK); 

    // Graphics context no longer needed so dispose it 
    g2d.dispose(); 

    return bufferedImage; 
} 

Я попытался установить его прозрачным, но без успеха, поэтому я разместил эту рабочую часть.

ответ

39

Использовать BufferedImage.TYPE_INT_ARGB вместо BufferedImage.TYPE_INT_RGB. И сохраните его до PNG image, JPEG не поддерживает прозрачность.

UPD:

Для установить фон прозрачным, используйте его:

g2d.setComposite(AlphaComposite.Clear); 
g2d.fillRect(0, 0, w, h); 

И обращаю ваше изображение:

g2d.setComposite(AlphaComposite.Src); 
drawPoints(Tablet.getPenPoints(), g2d, Color.BLACK); 
+0

Я использовал BufferedImage.TYPE_INT_ARGB, и я сохранил его как png-изображение. Но теперь, как я могу установить альфа-парамером фона? – Igr

+0

Попробуйте обновленный раздел – SeniorJD

+0

Он работает точно так, как я хотел, спасибо – Igr

0

JPEG не поддерживает трансперенситивность. Вы должны использовать другой целевой формат, например png.

0

У вас настроено буферизованное изображение типа RGB, не имеющего альфа-компонента, вам придется использовать тот, у которого есть альфа, чтобы поддерживать прозрачность.

1

Как уже упоминалось, вы можете Не сохраняйте JPEG с прозрачностью.

Однако, вы можете сохранить свой файл так же, как и вы (в JPEG, хотя я предлагаю использовать в этом случае полутоновый JPEG), а затем интерпретировать белые части как прозрачные, а черные части - непрозрачными (т.е.: используйте изображение в градациях серого как альфа-маску). Затем вы можете просто окрасить непрозрачные части черного или синего цвета, чтобы они выглядели как ручка.

Подумайте о белой области, как о бумаге, и о черных деталях, покрытых чернилами. Обратите внимание, что этот метод будет работать только в случае использования, когда все белые пиксели должны быть прозрачными. Другие ответы в этой теме будут работать лучше в общем случае.

+0

И если изображение имеет белые части внутри него, которые не должны быть прозрачными? – SeniorJD

+0

@SeniorJD Вопрос OP касался подписей с планшета, поэтому я не думаю, что это имеет значение. Подумайте о белой области, как о бумаге, и о черных частях, покрытых чернилами. Если вам действительно нужны непрозрачные белые части, это не сработает. – haraldK