Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-1157699691
DelphiLexx
2006-09-08 11:14
2006.10.22
Вызов метода дедушки


2-1160294954
ArtemESC
2006-10-08 12:09
2006.10.22
Возврат из вызываемой процедуры или функции...


3-1156510745
PEAKTOP
2006-08-25 16:59
2006.10.22
EXECUTE BLOCK


2-1160167184
goadway
2006-10-07 00:39
2006.10.22
KAk из DBGRID передать параметр в ShellExecute


2-1160035684
Megabyte
2006-10-05 12:08
2006.10.22
Обработка исключения





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский