Обрезка изображений в Itext - PullRequest
4 голосов
/ 15 ноября 2011

Есть ли простой способ обрезать изображение в Itext?

У меня есть следующий код:

URL url = new URL(imgUrl);

connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
iStream = connection.getInputStream();
img = new Jpeg(url);

// a method like 
// img.crop(x1, y1, x2, y2) would be nice.

Теперь я хочу "удалить" полосу, скажем, 20 пикселейвлево и 20 пикселей вправо.Есть ли простой способ сделать это?

Ответы [ 5 ]

5 голосов
/ 23 января 2013

Вот еще один способ обрезать изображение с помощью PdfTemplate.

public static Image cropImage(Image image, PdfWriter writer, float x, float y, float width, float height) throws DocumentException {
    PdfContentByte cb = writer.getDirectContent();
    PdfTemplate t = cb.createTemplate(width, height);
    float origWidth = image.getScaledWidth();
    float origHeight = image.getScaledHeight();
    t.addImage(image, origWidth, 0, 0, origHeight, -x, -y);
    return Image.getInstance(t);
}

Обратите внимание, что для этого не требуется вызывать t.rectangle (), t.clip () или t.newPath ().

4 голосов
/ 29 сентября 2015

Решение Натана почти сработало для меня. Единственная оставшаяся проблема - белые поля из-за того, что PdfTemplate имеет тот же размер, что и изображение для кадрирования.

Мое решение:

public Image cropImage(PdfWriter writer, Image image, float leftReduction, float rightReduction, float topReduction, float bottomReduction) throws DocumentException {
    float width = image.getScaledWidth();
    float height = image.getScaledHeight();
    PdfTemplate template = writer.getDirectContent().createTemplate(
            width - leftReduction - rightReduction,
            height - topReduction - bottomReduction);
    template.addImage(image,
            width, 0, 0,
            height, -leftReduction, -bottomReduction);
    return Image.getInstance(template);
}
3 голосов
/ 16 ноября 2011

Вы можете исследовать, используя обтравочный контур. Вам нужно знать ширину и высоту JPEG. Код может выглядеть примерно так:

PdfTemplate t = writer.getDirectContent().createTemplate(850, 600);
t.rectangle(x+20,y+20, width-40, height-40);
t.clip();
t.newPath();
t.addImage(img, width, 0, 0, height, x, y);
1 голос
/ 13 сентября 2016

Я также столкнулся с этой проблемой, и вот что я сделал:

Концепция: Получить изображение как буферизованное изображение Создайте BufferedImage и визуализируйте как изображение (iText)

Document document = new Document(PageSize.A4.rotate());
document.open();

//Get the image as Buffere Image
BufferedImage awtImage = ImageIO.read(new URL("image url"));

//Crop: Sample, get Upper Half of the image
BufferedImage awtImageUpper = awtImage.getSubimage(0, 0, awtImage.getWidth(), awtImage.getHeight()/2);

//Make BufferedImage and render as Image (in iText)
ByteArrayOutputStream baosImage = new ByteArrayOutputStream();
ImageIO.write(awtImageUpper, "png", baosImage);
Image iTextImage = Image.getInstance(baosImage.toByteArray());


//Display Image in pdf
document.add(new Paragraph("image Upper half"));
document.add((Element) iTextImage);
1 голос
/ 10 апреля 2014

// Высота фотографии 4x6 дюймов = ширина 432 = 288

// scale
if (isMatchFrame) {
    /* width */
    proportion = image.getWidth() / width;
    image.scaleAbsolute((float) width, image.getHeight() / proportion);
} else {
    /* hight */
    proportion = image.getHeight() / height;
    image.scaleAbsolute(image.getWidth() / proportion, (float) height);
}
// crop
document.setMargins((height - image.getHeight()/proportion) / 2, 0, (width - image.getWidth()/proportion) / 2 , 0);

.наслаждайся этим.

...