![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
bmp or jpeg в черно белый
Тимофей © (2009-11-02 00:44:00)Народ нигде не нашел инфы по тому как сделать картинку черно-белой без оттенков серого. bmp or jpeg
Омлет (2009-11-02 22:26:00) [1]> [8] Sapersky (02.11.09 21:52)
Интересная статья..
Sapersky (2009-11-02 21:52:00) [2]Ни одна система не работает напрямую в jpeg все переводят для выполнения операций в bmp
Кое-какие операции можно делать без перепаковки, хотя преобразование в два цвета вряд ли к ним относится.
http://www.betterjpeg.com/
(Convert to Black & White (Grayscale) - это, видимо, перевод в оттенки серого, в jpeg цветность хранится отдельно от яркости, и можно её просто выкинуть).
Так, для общего развития :)
> перевел в 1 битовый
Не тру :-/
Здесь бинарные оценки типа "тру/не тру" вряд ли применимы. Тех же коэфф-тов для цветов есть несколько вариантов, и какой их них лучше - неизвестно (хотя закономерность "зелёный ярче" прослеживается везде, и насчёт чел. глаза я в курсе).
ИМХО, куда большее влияние на качество картинки оказывает дизеринг (если он приемлем в данном случае):
http://en.wikipedia.org/wiki/Dither#Dithering_algorithms
Омлет (2009-11-02 20:17:00) [3]> [4] brother © (02.11.09 05:00)
> http://www.delphimaster.ru/articles/pixels/
> и про сканлайн забываем навсегда ;)
Оно там заточено под TColor и универсальность в ущерб скорости.
И оно будет падать на растрах с высотой 0 или 1:
//базовый адрес блока данных
FStart := Integer(FBitmap.Scanline[0]);
//разность между адресами соседних строк развертки растра (обычно отриц.)
FDelta := Integer(FBitmap.Scanline[1]) - FStart;
Поэтому, статью я бы советовал только в учебных целях.
Anatoly Podgoretsky (2009-11-02 09:18:00) [4]А теперь быстро и просто
загружешь в редактор и сохраняешь в нужном формате.
Anatoly Podgoretsky (2009-11-02 09:16:00) [5]> Тимофей (02.11.2009 00:44:00) [0]
Ни одна система не работает напрямую в jpeg все переводят для выполнения операций в bmp
Алгоритм такой,
переводишь в bmp
затем переводишь в серый
после того отсекаешь по любой линии на шкале серого
переводишь в jpeg
brother (2009-11-02 05:00:00) [6]http://www.delphimaster.ru/articles/pixels/
и про сканлайн забываем навсегда ;)
Омлет (2009-11-02 02:49:00) [7]> перевел в 1 битовый
Не тру :-/
procedure BWThreshold24Bit(Bmp: TBitmap; Value: Byte = 127);
var
P : PByteArray;
XR, XG, XB : Integer;
X, Y, NVal : Integer;
BytesInScanLine : Integer;
DIB : TDIBSection;
begin
if (Bmp.PixelFormat = pf24Bit) and
(GetObject(Bmp.Handle, SizeOf(DIB), @DIB) = SizeOf(DIB)) and
(DIB.dsBmih.biHeight > 0) then
begin
BytesInScanLine := (((DIB.dsBmih.biWidth * DIB.dsBmih.biBitCount) + 31) and not 31) div 8;
P := DIB.dsBm.bmBits;
NVal := Value shl 8;
for Y := DIB.dsBmih.biHeight - 1 downto 0 do
begin
XB := 0;
XG := 1;
XR := 2;
for X := 0 to DIB.dsBmih.biWidth - 1 do
begin
{ Оптимизация для (0.299*Red + 0.587*Green + 0.114*Blue > Value) }
if 28*P[XB] + 151*P[XG] + 77*P[XR] > NVal then
begin
P[XB] := 255;
P[XG] := 255;
P[XR] := 255;
end
else begin
P[XB] := 0;
P[XG] := 0;
P[XR] := 0;
end;
Inc(XB, 3);
Inc(XG, 3);
Inc(XR, 3);
end;
Integer(P) := Integer(P) + BytesInScanLine;
end;
end;
end;
Специально фанатам ScanLine ))
sniknik (2009-11-02 00:50:00) [8]Monochrome:= true;
Тимофей (2009-11-02 00:49:00) [9]сам догодался, перевел в 1 битовый)) правда минус в том что текст стал очень тонкий))