Ahoj,

 pokud to pomuze, ja jsem to v PHP delal takto (Alpha Blending):

$r=($rgbImage["red"]*$this->alpha+$rgbStamp["red"]*(256-$this->alpha))/256; $g=($rgbImage["green"]*$this->alpha+$rgbStamp["green"]*(256-$this->alpha))/256; $b=($rgbImage["blue"]*$this->alpha+$rgbStamp["blue"]*(256-$this->alpha))/256;

Tj. pocital jsem to pixel po pixelu (program jsem psal dle popisu algoritmu pro Alpha Blending).
 To jde i v Jave docela snadno, ale syntax si zpameti nepamatuji.

$this->alpha je alpha pro obrazek, dobre mi fungovala hodnota 140. $rgbImage je jeden obrazovy bod puvodniho obrazku
 $rgbStamp je jeden obrazovy bod watermarku

Jeste muzete pouzit Additve Blending, ale ten vypocet uz potom neni tak pruzracne jednoduchy (ale asi to taky budou 3 radky kodu).
 Jako vodoznak jsem pouzival cernobily GIF.
Vysledek muzete videt napr. na http://www.avacom.cz/fotom-ACER-n50-Handheld%2C-n50-Series%2C-n50-Premium-Li-ion-37V-1060mAh-3942.jpeg

      Lukas


PS: kontrolni otazka k vasemu kodu - mate v obrazku vodoznaku spravne nastaven alpha kanal? Pak by totiz melo fungovat i jenom obycejne vykresleni na jiz "pokreslene" platno.


Vlastimil Vávrů wrote:

Za boha nemůžu rozchodit průhlednost u kládaného vodoznaku.

Na googlu jsem našel spousty příkladů a vytvořil jsem si následující statickou metodu:

private static void createWaterMark(BufferedImage img, BufferedImage watermark, float alpha, float percentSize,
            int border) {

        int newWatWidth = Math.round(percentSize * img.getWidth());
int newWatHeight = Math.round((newWatWidth / (1.0f * watermark.getWidth())) * watermark.getHeight());

        int watOffsetX = img.getWidth() - newWatWidth - border;
        int watOffsetY = img.getHeight() - newWatHeight - border;

BufferedImage resizedThumbnail = new BufferedImage(newWatWidth, newWatHeight, BufferedImage.TYPE_INT_RGB);
        Graphics2D graphics2D = resizedThumbnail.createGraphics();
graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); graphics2D.drawImage(watermark, 0, 0, newWatWidth, newWatHeight, null);
        Graphics2D g = img.createGraphics();
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
        g.drawImage(resizedThumbnail, watOffsetX, watOffsetY, null);
resizedThumbnail.flush(); g.dispose(); }

klíčová pro průhlednost je řádka g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));

kde se pomocí AlphaComposite nastavuje způsob interakce barvy původního pixelu obrázku s barvou pixelu vkládaného obrázku (vodoznaku).

Problém je, že se kýžená průhlednost nedostavuje - průhledné pixely se zobrazí černou barvou.

Děkuji za rady.

Odpovedet emailem