Форум: "Media";
Текущий архив: 2006.10.22;
Скачать: [xml.tar.bz2];
ВнизВырезать прямоугольник из JPEG Найти похожие ветки
← →
AndreW777 (2006-03-17 19:55) [0]У меня такая проблема: мне надо загрузить JPEG файл, вырезать из него прямоугольник и сохранить этот прямоугольник на диск в том-же формате JPEG. Я сделал это так гружу JPEG, перевожу его в Bitmap, из битмапа вырезаю прямоугольник, перевожу его в JPEG и сохраняю, но это как-то не очень харашо. Пожскажиите пожайлуста можно ли это реализовать это как-нибудь по другому?
← →
Virgo_Style © (2006-03-18 08:03) [1]AndreW777 (17.03.06 19:55)
это как-то не очень харашо
"что такое хорошо, и что такое плохо?" (c)
← →
Andrew777 (2006-03-21 22:02) [2]Просто при конвертировании jpg->bmp->jpg на последнем могут появится шумы который на первом небыло, хотелось бы избавится от этого.
Заранее спосибо.
← →
Sapersky (2006-03-22 12:59) [3]http://graphicssoft.about.com/b/a/041577.htm
Утверждают, что the source code of Jpegcrop is freely available for software developers who wish to add lossless JPEG cropping to their software.
← →
Andrew777 (2006-03-22 15:33) [4]Чё-то я там ничего не нашёл. С английским у меня не очень хорошо. Может быть у кого-нибудь пример будет, или что-нибудь на русском. Спасибо.
← →
Sapersky (2006-03-22 18:42) [5]На русском - вряд ли. Примеры на Дельфи, как ни странно, есть (я подозревал что оно только на Си):
http://www.nomssi.de/pasjpeg/pasjpeg.html
← →
Andrew777 (2006-03-23 15:20) [6]Спасибо. Но я там мало чего понял. Если тебе не сложно напиши поконкретней где смотреть, или примерчик. Буду оочень благодарен.
← →
Sapersky (2006-03-23 17:21) [7]Первая ссылка. Библиотека - альтернатива стандартному jpeg.pas. В её составе есть работающая из командной строки утилита JpegTran (jpegtran.pas), которая может делать в том числе и вырезание прямоугольника. Должна, во всяком случае, хотя по умолчанию эта опция (CROP_SUPPORTED) отключена.
Можно ещё посмотреть компоненты, основанные на pasjpeg (последние 3 ссылки). Может быть, они реализуют функцию вырезания (в смысле, более простой интерфейс к ней), хотя вряд ли.
← →
Andrew777 (2006-03-23 19:55) [8]Вот теперь ношёл. Долго пытался, но как это реализовать в моей проге на дельфи так и не понял.
← →
Sapersky (2006-03-24 16:41) [9]Ладно, тебе повезло :)
Я решил, что lossless crop мне тоже пригодится и написал (в основном скопировал из jpegtran) вот это:
function JpegTransform(Const SrcFName, DstFName : String;
Operation : JXFORM_CODE; Rect : PRect = nil): Boolean;
Var
srcinfo : jpeg_decompress_struct;
dstinfo : jpeg_compress_struct;
jsrcerr, jdsterr : jpeg_error_mgr;
src_coef_arrays, dst_coef_arrays : jvirt_barray_tbl_ptr;
input_file, output_file : FILE;
copyoption : JCOPY_OPTION;
transformoption : jpeg_transform_info; { image transformation options }
k : Integer;
begin
Result := False;
If (Operation = JXFORM_CUT) and (Rect = nil) then Exit;
{ Initialize the JPEG decompression object with default error handling. }
srcinfo.err := jpeg_std_error(jsrcerr);
jpeg_create_decompress(@srcinfo);
{ Initialize the JPEG compression object with default error handling. }
dstinfo.err := jpeg_std_error(jdsterr);
jpeg_create_compress(@dstinfo);
jsrcerr.trace_level := jdsterr.trace_level;
srcinfo.mem^.max_memory_to_use := dstinfo.mem^.max_memory_to_use;
AssignFile(input_file, SrcFName); Reset(input_file, 1);
AssignFile(output_file, DstFName); Rewrite(output_file, 1);
{ Specify data source for decompression }
jpeg_stdio_src(@srcinfo, @input_file);
{ Enable saving of extra markers that we want to copy }
copyoption := JCOPYOPT_ALL;
jcopy_markers_setup(@srcinfo, copyoption);
{ Read file header }
jpeg_read_header(@srcinfo, TRUE);
{ Any space needed by a transform option must be requested before
jpeg_read_coefficients so that memory allocation will be done right. }
With transformoption do begin
transform := Operation;
trim := False;
force_grayscale := False;
If (transform = JXFORM_CUT) then begin
xoffs := Rect.Left; yoffs := Rect.Top;
newwidth := Rect.Right - Rect.Left;
newheight := Rect.Bottom - Rect.Top;
end;
end;
jtransform_request_workspace(@srcinfo, transformoption);
{ Read source file as DCT coefficients }
src_coef_arrays := jpeg_read_coefficients(@srcinfo);
{ Initialize destination compression parameters from source values }
jpeg_copy_critical_parameters(@srcinfo, @dstinfo);
{ Adjust destination parameters if required by transform options;
also find out which set of coefficient arrays will hold the output. }
dst_coef_arrays := jtransform_adjust_parameters(@srcinfo, @dstinfo,
src_coef_arrays,
transformoption);
{ Specify data destination for compression }
jpeg_stdio_dest(@dstinfo, @output_file);
{ Start compressor (note no image data is actually written here) }
jpeg_write_coefficients(@dstinfo, dst_coef_arrays);
{ Copy to the output file any extra markers that we want to preserve }
jcopy_markers_execute(@srcinfo, @dstinfo, copyoption);
{ Execute image transformation, if any }
jtransform_execute_transformation(@srcinfo, @dstinfo,
src_coef_arrays,
transformoption);
If (Operation = JXFORM_CUT) then begin
k := dstinfo.max_h_samp_factor * DCTSIZE;
Rect.Left := Rect.Left div k * k;
k := dstinfo.max_v_samp_factor * DCTSIZE;
Rect.Top := Rect.Top div k * k;
Rect.Right := Rect.Left + dstinfo.image_width;
Rect.Bottom := Rect.Top + dstinfo.image_height;
end;
{ Finish compression and release memory }
jpeg_finish_compress(@dstinfo);
jpeg_destroy_compress(@dstinfo);
jpeg_finish_decompress(@srcinfo);
jpeg_destroy_decompress(@srcinfo);
{ Close files, if we opened them }
CloseFile(input_file);
CloseFile(output_file);
Result := True;
end;
Использование:
1) В jconfig.inc прописать {$define CROP_SUPPORTED}
2) В Transupp.pas, в процедуре do_transform в первых двух строчках заменить * DCTSIZE на div DCTSIZE (глюк обнаружился).
3) Собственно использование:
uses
Transupp, jdeferr, jerror, jmorecfg, jpeglib, cdjpeg,
jdatasrc, JDatadst, JCTrans, JDtrans, JdAPImin, JcAPImin;
r := Rect(10, 10, 200, 200);
JpegTransform(SrcName, DstName, JXFORM_CUT, @r);
В r задаётся прямоугольник, который хотелось бы вырезать, и возвращается то, что вырезалось на самом деле - у меня координаты выравнивались по горизонтали на 16, по вертикали на 8 (насколько я понимаю, зависит от типа jpeg"а). Т.е. вырезать в точности заданную область нельзя, но оно в большинстве случаев и не надо.
← →
Andrew777 (2006-03-24 21:30) [10]Спасибо. Всё работает.
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2006.10.22;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.038 c