Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Подскажите плз.(Работа с изображениями)
Форум программистов > Системное программирование > Java
Graf
Народ мне надо прочитать изображение из файла, что-нибудь на нем нарисовать или написать и записать в файл. Подскажите как можно это реализовать. Я научился читать изображения и записывать, с помощью чего можно изменять его?

Заранее благодарен всем, кто поможет. cool.gif

С уважением,
Graf
Graf
Народ подскажите как на изображении написать текст определенного типа шрифта и определенных размеров? Подскажите классы или библиотеки....
ois
Я не гуру, но чем смогу - помогу...

1. Как читать картинку (например JPEG) из файла:

FileInputStream in = new FileInputStream(fileName);
JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(in);
Image image = decoder.decodeAsBufferedImage();


2. Как писать картинку (например JPEG) в файл:
FileOutputStream out = new FileOutputStream(fileName);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode((BufferedImage) image);


Для работы с JPEG используются следующие классы:
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageDecoder;
import com.sun.image.codec.jpeg.JPEGImageEncoder;


3. Как нарисовать что-либо (в данном примере - текст) на картинке:
Graphics2D gfx = (Graphics2D)image.getGraphics();

gfx.setFont(new Font("Tahoma", Font.PLAIN, 24));
gfx.setColor(Color.RED);
gfx.drawString("Hello world!", 40, 40);


Для работы с фонтами используется класс java.awt.Font, для работы с графикой - java.awt.Graphics2D.
Lexa-xa
Цитата(ois @ 17:04:2007, 12:36 )
1. Как читать картинку (например JPEG) из файла:
КодFileInputStream in = new FileInputStream(fileName);
JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(in);
Image image = decoder.decodeAsBufferedImage();

... а дальше. Просто не могу понять как вставить картинку непосредственно в сам документ, т.е. в генерируемую страницу (хотя бы из файла), (также подразумевается, что после вставки картинки надо использовать вставку различных тегов, например
PrintWriter out = response.getWriter();
out.println("<b>end picture</b>");
)
ois
Цитата(Lexa-xa @ 29:05:2007, 14:16 )
... а дальше. Просто не могу понять как вставить картинку непосредственно в сам документ, т.е. в генерируемую страницу
*

А это точно вопрос из области Java? Спрашивали, как загрузить картинку, порисовать на ней и сохранить. Насчет вставить в документ - не совсем понял в какой именно...если можно, опиши суть вопроса?

PS Если разговор идет про html, то что мешает загрузить сохраненный где-то файл с картинкой с помощью тега <img>?
Lexa-xa
Цитата(ois @ 29:05:2007, 15:38 )
А это точно вопрос из области Java? Спрашивали, как загрузить картинку, порисовать на ней и сохранить.

Я поэтому и спросил по первой части (как загрузить), до сохранения не дошел и вряд ли понадобится wink.gif
Цитата(ois @ 29:05:2007, 15:38 )
Насчет вставить в документ - не совсем понял в какой именно...если можно, опиши суть вопроса?

Просто написал в самом кратце. Пишу развернуто. Есть jsp-страница, в которую необходимо вставить данные из MSSQL. В MSSQL тип Image, содержит картинку. Как следствие нужно ее вывести на требуемую страницу.
Например:
index.jsp
<jsp:include flush="true" page="servlet/pagecode.GenerateContent">
</jsp:include>

Соответственно в GenerateContent идет подключение к БД, и т.д. до чтения данных из поля Image.
(пока я эту затею забросил, т.к. не получается вывести картинку даже с диска dry.gif )
GenerateContent
InputStream is;
BufferedInputStream bis;
BufferedImage bi;

PrintWriter out = response.getWriter();

out.println("<table><tr><td>Picture");
is = resultSet.getBinaryStream("Image");
bis = new BufferedInputStream(is);
bi = ImageIO.read(bis);
img = (Image) bi;
// допустим здесь надо вывести картинку
// .....
out.println("</td></tr></table>");


Цитата
PS Если разговор идет про html, то что мешает загрузить сохраненный где-то файл с картинкой с помощью тега <img>?

Мешает то, что хранится не УРЛ файла, а его содержимое.
В принципе можно в БД сохранять ссылку на файл и затем его подгружать. Просто не хотелось бы привязываться к файловой структуре (хотя думаю придется) dry.gif
Pete
Тебе надо написать сервлет, который разобрав урл будет считывать бинарный код из базы и выдавать нужную картинку в выходной поток http-ответа, необходимо так же установить правильный тип контента для браузера (см. RFC2045, RFC2046), разумеется картинка as is должна выдаваться в поток.
В html страничке достаточно будет прописать урл в теге img, как это делается и для картинок обрабатываемых http-сервером.
Не обижайтесь, но настоятельно советую почитать основы http, servlets в java tutorial хотя бы, потому что походу у вас в голове каша smile.gif Доки съэкономят вам кучу времени, потому что вопросов у вас походу будет еще ого-го, а там есть ответы на многие вопросы.
Lexa-xa
Цитата(Pete @ 30:05:2007, 00:54 ) *
Тебе надо написать сервлет, который разобрав урл будет считывать бинарный код из базы и выдавать нужную картинку в выходной поток http-ответа,

Т.е. хочешь сказать, что в содержимом бинарного кода из базы хранится УРЛ картинки huh.gif
В том то и вопрос: как выдавать бинарный код в выходной поток http-ответа sad.gif
Цитата
необходимо так же установить правильный тип контента для браузера (см. RFC2045, RFC2046), разумеется картинка as is должна выдаваться в поток.
Будем разбираться с данным типом
Цитата
В html страничке достаточно будет прописать урл в теге img, как это делается и для картинок обрабатываемых http-сервером.
Про тег img итак все понятно
Цитата
Не обижайтесь, но настоятельно советую почитать основы http, servlets в java tutorial хотя бы, потому что походу у вас в голове каша smile.gif Доки съэкономят вам кучу времени, потому что вопросов у вас походу будет еще ого-го, а там есть ответы на многие вопросы.

Каша-то она есть , поэтому сюда и обратился за помощью wink.gif , только к чему она относится, к вопросу, или к варианту решения вопроса?

Литературу-то почитал уже, просто не знаю каким способом сделать, а также не знаю почему не получается, либо не правильно данные забиты в базу, либо тип данных не поддерживается, либо JDBC драйвер возвращает не то что нужно, либо что-то я не правильно делаю dry.gif .

Вообщем будет пробовать. Спасибо за советы.
Pete
Вот тебе сервлет, который читает файл изображения с диска и пишет в выходной поток, тебе нужна только вторая часть, там где установка параметров ответа и вывод в поток.

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// поскипано

import org.apache.commons.io.CopyUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


public class GetTempImageServlet extends HttpServlet {
    private static final Log LOG = LogFactory.getLog(GetTempImageServlet.class);
    private static final String IMAGE_ID_PARAM = "imageId";

    /**
     * Image type: thumbnail or full-size image
     */
    private static final String IMAGE_TYPE_PARAM = "imageType";
    private static final String IMAGE_TYPE_THUMBNAIL = "thumbnail";
    private static final String IMAGE_TYPE_ANNOTATED= "annotated";
    private static final String IMAGE_TYPE_CURRENT= "current";

    //Initialize global variables
    public void init() throws ServletException {
    }

    //Process the HTTP Get request
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws
            ServletException, IOException {
        //Temporary file identifier
        String imageId = request.getParameter(IMAGE_ID_PARAM);
        String imageType = request.getParameter(IMAGE_TYPE_PARAM);

        LOG.debug("Requested image with id " + imageId);
        if (imageId == null) {
            LOG.warn("Image not specified");
            response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Image id not specified");
            return;
        }

        // get requested image
        TemporaryImageCollection col = SessionHelper.getTempImageCollection(request.getSession());
        TemporaryImage tempImage = col.findById(imageId);

        if (tempImage == null) {
            LOG.warn("Image not found");
            response.sendError(HttpServletResponse.SC_NOT_FOUND, "Image with id " + imageId + " not found");
            return;
        }

        // Send accompanying headers
        File file = null;
        if(imageType != null && imageType.equals(IMAGE_TYPE_THUMBNAIL)){
            file = tempImage.getThumbnail().getFile();
        } else if(imageType != null && imageType.equals(IMAGE_TYPE_CURRENT)){
            file = tempImage.getCurrent().getFile();
        } else {
            file = tempImage.getAnnotated().getFile();
        }
        response.setContentLength((int) file.length());
        response.setContentType(Configuration.getIntermediateFormat().getMimeType());
        response.setHeader("Content-Disposition",
                           "filename=" + file.getName() + "." +
                           Configuration.getIntermediateFormat().getSuffix());

        ServletUtils.preventCaching(response);

        OutputStream os = response.getOutputStream();
        InputStream is = new FileInputStream(file);

        try {
            CopyUtils.copy(is, os);
        } finally {
            is.close();
            os.close();
        }
        LOG.debug("File has been transferred successfully");
    }

    //Clean up resources
    public void destroy() {
    }
}



С базой делаешь так: создаешь табличу images, в ней поля blob или image для самого изображения, user-friendly filename для названия файла и id. Потом создаешь сервлет который из урла в теге img ]]>http://example.com/getimage?id=1234]]> берет значение параметра id и вытягивает из базы код картинки в виде byte[] и отдаешь в поток, куда подставлять filename из примера поймешь.
Lexa-xa
Цитата(Pete @ 30:05:2007, 13:40 )
Вот тебе сервлет, который читает файл изображения с диска и пишет в выходной поток, тебе нужна только вторая часть, там где установка параметров ответа и вывод в поток.
*

Огромное спасибки за данный пример, примерно то что искал rolleyes.gif Только вот опять не задача, если сервлет выполняется один (т.е. просто запустить на сервере), то выводит то что надо, если же его вставлять в страницу в котором используется запись в response PrintWriter'ом, то как следствие Exception на getOutputStream, вот теперь думаю, как их объединить вместе unsure.gif

Еще раз благодарю за код smile.gif
Pete
Так еще раз попытаюсь вам объяснить: не надо никакую картинку выводить в html!!! html - это исключительно текстовый формат и не поддерживает embedded объекты! Если ты используешь вывод в сервлете для генерации html, а не jsp, то тебе надо все лишь написать:


PrintWriter out = response.getWriter();

out.println("<table><tr><td>Picture");
out.println("<img src=\"http://example.com/getimage?id=1234\" />"); // !!!
out.println("</td></tr></table>");

Эксепшены могут быть, если не корректно работаешь с потоками, пытаешь установить заголовки http ответа после того как уже что-то вывел в поток. Гадать можно долго, давай более подробную информаци.
Lexa-xa
Цитата(Pete @ 31:05:2007, 14:21 )
out.println("<img src=\"http://example.com/getimage?id=1234\" />"); // !!!
*

Вот блин мир я просто думал что http://example.com/getimage?id=1234 УРЛ страницы, а не картинки, совсем забыл что так можно указывать сервлет с параметрами. Спасибо заработало. smile.gif
P.S. Осталась еще одна проблемка, но это уже по текстовому формату. rolleyes.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2008 IPS, Inc.