Вирізати прямокутник з jpeg

Вирізати прямокутник з JPEG

У мене така проблема: мені треба завантажити JPEG файл, вирізати з нього прямокутник і зберегти цей прямокутник на диск в тому-ж форматі JPEG. Я зробив це так вантажу JPEG, перекладаю його в Bitmap, з бітмапами вирізаю прямокутник, перекладаю його в JPEG і зберігаю, але це якось не дуже харашо. Пожскажііте пожайлуста чи можна це реалізувати це як-небудь інакше?

AndreW777 # XA0; (17.03.06 19:55)
це якось не дуже харашо

"Що таке добре і що таке погано?" (C)

Просто при конвертації jpg-> bmp-> jpg на останньому можуть з'явиться шуми який на першому не було, хотілося б позбавиться від цього.
Заздалегідь спосибо.

Стверджують, що the source code of Jpegcrop is freely available for software developers who wish to add lossless JPEG cropping to their software.

Че-то я там нічого не знайшов. З англійською у мене не дуже добре. Може бути у кого-небудь приклад буде, або що-небудь російською. Дякуємо.

Російською - навряд чи. Приклади на Дельфі, як не дивно, є (я підозрював що воно тільки на Сі):

Дякуємо. Але я там мало чого зрозумів. Якщо тобі не складно напиши поконкретней де дивитися, чи приклад. Буду оочень вдячний.

Ось тепер ношёл. Довго намагався, але як це реалізувати в моїй проге на дельфи так і не зрозумів.

Гаразд, тобі пощастило :)
Я вирішив, що lossless crop мені теж стане в нагоді і написав (в основному скопіював з jpegtran) ось це:

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

With transformoption do begin
# XA0; transform: = Operation;
# XA0; trim: = False;
# XA0; force_grayscale: = False;
# XA0; If (transform = JXFORM_CUT) then begin
# XA0; # XA0; xoffs: = Rect.Left; yoffs: = Rect.Top;
# XA0; # XA0; newwidth: = Rect.Right - Rect.Left;
# XA0; # XA0; newheight: = Rect.Bottom - Rect.Top;
# XA0; end;
end;

# XA0; also find out which set of coefficient arrays will hold the output.>
dst_coef_arrays: = jtransform_adjust_parameters (@srcinfo, @dstinfo,
# XA0; # XA0; # XA0; src_coef_arrays,
# XA0; # XA0; # XA0; transformoption);


jtransform_execute_transformation (@srcinfo, @dstinfo,
# XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; src_coef_arrays,
# XA0; # XA0; # XA0; transformoption);

If (Operation = JXFORM_CUT) then begin
# XA0; k: = dstinfo.max_h_samp_factor * DCTSIZE;
# XA0; Rect.Left: = Rect.Left div k * k;
# XA0; k: = dstinfo.max_v_samp_factor * DCTSIZE;
# XA0; Rect.Top: = Rect.Top div k * k;
# XA0; Rect.Right: = Rect.Left + dstinfo.image_width;
# XA0; Rect.Bottom: = Rect.Top + dstinfo.image_height;
end;

Використання:
1) В jconfig.inc прописати
2) В Transupp.pas, в процедурі do_transform в перших двох рядках замінити # XA0; * DCTSIZE на div DCTSIZE (глюк виявився).
3) Власне використання:
uses
# XA0; Transupp, jdeferr, jerror, jmorecfg, jpeglib, cdjpeg,
# XA0; jdatasrc, JDatadst, JCTrans, JDtrans, JdAPImin, JcAPImin;

r: = Rect (10, 10, 200, 200);
JpegTransform (SrcName, DstName, JXFORM_CUT, @r);

В r задається прямокутник, який хотілося б вирізати, і повертається те, що вирізувалося насправді - у мене координати вирівнювалися по горизонталі на 16, по вертикалі на 8 (наскільки я розумію, залежить від типу jpeg "а). Тобто вирізати в точності задану область не можна, але воно в більшості випадків і не треба.

Дякуємо. Все працює.

Схожі статті