Подскажите плз.(Работа с изображениями)

Тема в разделе "Java", создана пользователем Graf, 16 апр 2007.

Статус темы:
Закрыта.
  1. Graf

    Graf Гость

    Народ мне надо прочитать изображение из файла, что-нибудь на нем нарисовать или написать и записать в файл. Подскажите как можно это реализовать. Я научился читать изображения и записывать, с помощью чего можно изменять его?

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

    С уважением,
    Graf
     
  2. Graf

    Graf Гость

    Народ подскажите как на изображении написать текст определенного типа шрифта и определенных размеров? Подскажите классы или библиотеки....
     
  3. ois

    ois Гость

    Я не гуру, но чем смогу - помогу...

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

    Код (Text):
    FileInputStream in = new FileInputStream(fileName);
    JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(in);
    Image image = decoder.decodeAsBufferedImage();
    2. Как писать картинку (например JPEG) в файл:
    Код (Text):
    FileOutputStream out = new FileOutputStream(fileName);
    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
    encoder.encode((BufferedImage) image);
    Для работы с JPEG используются следующие классы:
    Код (Text):
    import com.sun.image.codec.jpeg.JPEGCodec;
    import com.sun.image.codec.jpeg.JPEGImageDecoder;
    import com.sun.image.codec.jpeg.JPEGImageEncoder;
    3. Как нарисовать что-либо (в данном примере - текст) на картинке:
    Код (Text):
    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.
     
  4. Lexa-xa

    Lexa-xa Гость

    <!--QuoteBegin-ois+17:04:2007, 12:36 -->
    <span class="vbquote">(ois @ 17:04:2007, 12:36 )</span><!--QuoteEBegin-->1. Как читать картинку (например JPEG) из файла:
    КодFileInputStream in = new FileInputStream(fileName);
    JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(in);
    Image image = decoder.decodeAsBufferedImage();[/quote]
    ... а дальше. Просто не могу понять как вставить картинку непосредственно в сам документ, т.е. в генерируемую страницу (хотя бы из файла), (также подразумевается, что после вставки картинки надо использовать вставку различных тегов, например
    PrintWriter out = response.getWriter();
    out.println("<b>end picture</b>");
    )
     
  5. ois

    ois Гость

    <!--QuoteBegin-Lexa-xa+29:05:2007, 14:16 -->
    <span class="vbquote">(Lexa-xa @ 29:05:2007, 14:16 )</span><!--QuoteEBegin-->... а дальше. Просто не могу понять как вставить картинку непосредственно в сам документ, т.е. в генерируемую страницу
    [snapback]67435" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    А это точно вопрос из области Java? Спрашивали, как загрузить картинку, порисовать на ней и сохранить. Насчет вставить в документ - не совсем понял в какой именно...если можно, опиши суть вопроса?

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

    Lexa-xa Гость

    <!--QuoteBegin-ois+29:05:2007, 15:38 -->
    <span class="vbquote">(ois @ 29:05:2007, 15:38 )</span><!--QuoteEBegin-->А это точно вопрос из области Java? Спрашивали, как загрузить картинку, порисовать на ней и сохранить.[/quote]
    Я поэтому и спросил по первой части (как загрузить), до сохранения не дошел и вряд ли понадобится ;)
    <!--QuoteBegin-ois+29:05:2007, 15:38 -->
    <span class="vbquote">(ois @ 29:05:2007, 15:38 )</span><!--QuoteEBegin-->Насчет вставить в документ - не совсем понял в какой именно...если можно, опиши суть вопроса?[/quote]
    Просто написал в самом кратце. Пишу развернуто. Есть jsp-страница, в которую необходимо вставить данные из MSSQL. В MSSQL тип Image, содержит картинку. Как следствие нужно ее вывести на требуемую страницу.
    Например:
    index.jsp
    <jsp:include flush="true" page="servlet/pagecode.GenerateContent">
    </jsp:include>

    Соответственно в GenerateContent идет подключение к БД, и т.д. до чтения данных из поля Image.
    (пока я эту затею забросил, т.к. не получается вывести картинку даже с диска :) )
    GenerateContent
    Код (Text):
    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>");
    Мешает то, что хранится не УРЛ файла, а его содержимое.
    В принципе можно в БД сохранять ссылку на файл и затем его подгружать. Просто не хотелось бы привязываться к файловой структуре (хотя думаю придется) :)
     
  7. Pete

    Pete Гость

    Тебе надо написать сервлет, который разобрав урл будет считывать бинарный код из базы и выдавать нужную картинку в выходной поток http-ответа, необходимо так же установить правильный тип контента для браузера (см. RFC2045, RFC2046), разумеется картинка as is должна выдаваться в поток.
    В html страничке достаточно будет прописать урл в теге img, как это делается и для картинок обрабатываемых http-сервером.
    Не обижайтесь, но настоятельно советую почитать основы http, servlets в java tutorial хотя бы, потому что походу у вас в голове каша ;) Доки съэкономят вам кучу времени, потому что вопросов у вас походу будет еще ого-го, а там есть ответы на многие вопросы.
     
  8. Lexa-xa

    Lexa-xa Гость

    Т.е. хочешь сказать, что в содержимом бинарного кода из базы хранится УРЛ картинки :huh:
    В том то и вопрос: как выдавать бинарный код в выходной поток http-ответа :(
    Будем разбираться с данным типом
    Про тег img итак все понятно
    Каша-то она есть , поэтому сюда и обратился за помощью ;) , только к чему она относится, к вопросу, или к варианту решения вопроса?

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

    Вообщем будет пробовать. Спасибо за советы.
     
  9. Pete

    Pete Гость

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

    Код (Text):
    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 из примера поймешь.
     
  10. Lexa-xa

    Lexa-xa Гость

    <!--QuoteBegin-Pete+30:05:2007, 13:40 -->
    <span class="vbquote">(Pete @ 30:05:2007, 13:40 )</span><!--QuoteEBegin-->Вот тебе сервлет, который читает файл изображения с диска и пишет в выходной поток, тебе нужна только вторая часть, там где установка параметров ответа и вывод в поток.
    [snapback]67588" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Огромное спасибки за данный пример, примерно то что искал :blink: Только вот опять не задача, если сервлет выполняется один (т.е. просто запустить на сервере), то выводит то что надо, если же его вставлять в страницу в котором используется запись в response PrintWriter'ом, то как следствие Exception на getOutputStream, вот теперь думаю, как их объединить вместе :unsure:

    Еще раз благодарю за код :)
     
  11. Pete

    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 ответа после того как уже что-то вывел в поток. Гадать можно долго, давай более подробную информаци.
     
  12. Lexa-xa

    Lexa-xa Гость

    <!--QuoteBegin-Pete+31:05:2007, 14:21 -->
    <span class="vbquote">(Pete @ 31:05:2007, 14:21 )</span><!--QuoteEBegin-->out.println("<img src=\"http://example.com/getimage?id=1234\" />"); // !!!
    [snapback]67695" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Вот блин мир я просто думал что http://example.com/getimage?id=1234 УРЛ страницы, а не картинки, совсем забыл что так можно указывать сервлет с параметрами. Спасибо заработало. :unsure:
    P.S. Осталась еще одна проблемка, но это уже по текстовому формату. :blink:
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей