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.