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

  • Автор темы Graf
  • Дата начала
Статус
Закрыто для дальнейших ответов.
G

Graf

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

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

С уважением,
Graf
 
G

Graf

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

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.
 
L

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>");
)
 
O

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>?
 
L

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

Pete

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

Lexa-xa

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

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

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

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 берет значение параметра id и вытягивает из базы код картинки в виде byte[] и отдаешь в поток, куда подставлять filename из примера поймешь.
 
L

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:

Еще раз благодарю за код :)
 
P

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

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:
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!