<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=97283&amp;view=findpost&amp;p=733423</guid>
        <pubDate>Mon, 30 May 2005 16:51:05 +0000</pubDate>
        <title>Нужен алгоритм качественного Resize&amp;#39;a</title>
        <link>https://forum.sources.ru/index.php?showtopic=97283&amp;view=findpost&amp;p=733423</link>
        <description><![CDATA[Aleks P.: Благадарю  :)]]></description>
        <author>Aleks P.</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=97283&amp;view=findpost&amp;p=733410</guid>
        <pubDate>Mon, 30 May 2005 16:35:22 +0000</pubDate>
        <title>Нужен алгоритм качественного Resize&amp;#39;a</title>
        <link>https://forum.sources.ru/index.php?showtopic=97283&amp;view=findpost&amp;p=733410</link>
        <description><![CDATA[s-mike: <div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">procedure MakeThumbNail(const Src, Dest: TBitmap);</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;PRGB24 = ^TRGB24;</div><div class="code_line">&nbsp;&nbsp;TRGB24 = packed record</div><div class="code_line">&nbsp;&nbsp; &nbsp;B: Byte;</div><div class="code_line">&nbsp;&nbsp; &nbsp;G: Byte;</div><div class="code_line">&nbsp;&nbsp; &nbsp;R: Byte;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;x, y, ix, iy: integer;</div><div class="code_line">&nbsp;&nbsp;x1, x2, x3: integer;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;xscale, yscale: single;</div><div class="code_line">&nbsp;&nbsp;iRed, iGrn, iBlu, iRatio: Longword;</div><div class="code_line">&nbsp;&nbsp;p, c1, c2, c3, c4, c5: tRGB24;</div><div class="code_line">&nbsp;&nbsp;pt, pt1: pRGB24;</div><div class="code_line">&nbsp;&nbsp;iSrc, iDst, s1: integer;</div><div class="code_line">&nbsp;&nbsp;i, j, r, g, b, tmpY: integer;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;RowDest, RowSource, RowSourceStart: integer;</div><div class="code_line">&nbsp;&nbsp;w, h: integer;</div><div class="code_line">&nbsp;&nbsp;dxmin, dymin: integer;</div><div class="code_line">&nbsp;&nbsp;ny1, ny2, ny3: integer;</div><div class="code_line">&nbsp;&nbsp;dx, dy: integer;</div><div class="code_line">&nbsp;&nbsp;lutX, lutY: array of integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if src.PixelFormat &#60;&#62; pf24bit then src.PixelFormat := pf24bit;</div><div class="code_line">&nbsp;&nbsp;if dest.PixelFormat &#60;&#62; pf24bit then dest.PixelFormat := pf24bit;</div><div class="code_line">&nbsp;&nbsp;w := Dest.Width;</div><div class="code_line">&nbsp;&nbsp;h := Dest.Height;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if (src.Width &#60;= dest.Width) and (src.Height &#60;= dest.Height) then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;dest.Assign(src);</div><div class="code_line">&nbsp;&nbsp; &nbsp;exit;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;iDst := (w * 24 + 31) and not 31;</div><div class="code_line">&nbsp;&nbsp;iDst := iDst div 8; //BytesPerScanline</div><div class="code_line">&nbsp;&nbsp;iSrc := (Src.Width * 24 + 31) and not 31;</div><div class="code_line">&nbsp;&nbsp;iSrc := iSrc div 8;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;xscale := 1 / (w / src.Width);</div><div class="code_line">&nbsp;&nbsp;yscale := 1 / (h / src.Height);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// X lookup table</div><div class="code_line">&nbsp;&nbsp;SetLength(lutX, w);</div><div class="code_line">&nbsp;&nbsp;x1 := 0;</div><div class="code_line">&nbsp;&nbsp;x2 := trunc(xscale);</div><div class="code_line">&nbsp;&nbsp;for x := 0 to w - 1 do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;lutX[x] := x2 - x1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;x1 := x2;</div><div class="code_line">&nbsp;&nbsp; &nbsp;x2 := trunc((x + 2) * xscale);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// Y lookup table</div><div class="code_line">&nbsp;&nbsp;SetLength(lutY, h);</div><div class="code_line">&nbsp;&nbsp;x1 := 0;</div><div class="code_line">&nbsp;&nbsp;x2 := trunc(yscale);</div><div class="code_line">&nbsp;&nbsp;for x := 0 to h - 1 do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;lutY[x] := x2 - x1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;x1 := x2;</div><div class="code_line">&nbsp;&nbsp; &nbsp;x2 := trunc((x + 2) * yscale);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;dec(w);</div><div class="code_line">&nbsp;&nbsp;dec(h);</div><div class="code_line">&nbsp;&nbsp;RowDest := integer(Dest.Scanline[0]);</div><div class="code_line">&nbsp;&nbsp;RowSourceStart := integer(Src.Scanline[0]);</div><div class="code_line">&nbsp;&nbsp;RowSource := RowSourceStart;</div><div class="code_line">&nbsp;&nbsp;for y := 0 to h do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;dy := lutY[y];</div><div class="code_line">&nbsp;&nbsp; &nbsp;x1 := 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;x3 := 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for x := 0 to w do</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;dx:= lutX[x];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;iRed:= 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;iGrn:= 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;iBlu:= 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;RowSource := RowSourceStart;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;for iy := 1 to dy do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pt := PRGB24(RowSource + x1);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for ix := 1 to dx do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;iRed := iRed + pt.R;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;iGrn := iGrn + pt.G;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;iBlu := iBlu + pt.B;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;inc(pt);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;RowSource := RowSource - iSrc;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;iRatio := 65535 div (dx * dy);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;pt1 := PRGB24(RowDest + x3);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;pt1.R := (iRed * iRatio) shr 16;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;pt1.G := (iGrn * iRatio) shr 16;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;pt1.B := (iBlu * iRatio) shr 16;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;x1 := x1 + 3 * dx;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;inc(x3,3);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;RowDest := RowDest - iDst;</div><div class="code_line">&nbsp;&nbsp; &nbsp;RowSourceStart := RowSource;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if dest.Height &#60; 3 then exit;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// Sharpening...</div><div class="code_line">&nbsp;&nbsp;s1 := integer(dest.ScanLine[0]);</div><div class="code_line">&nbsp;&nbsp;iDst := integer(dest.ScanLine[1]) - s1;</div><div class="code_line">&nbsp;&nbsp;ny1 := Integer(s1);</div><div class="code_line">&nbsp;&nbsp;ny2 := ny1 + iDst;</div><div class="code_line">&nbsp;&nbsp;ny3 := ny2 + iDst;</div><div class="code_line">&nbsp;&nbsp;for y := 1 to dest.Height - 2 do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;for x := 0 to dest.Width - 3 do</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;x1 := x * 3;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;x2 := x1 + 3;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;x3 := x1 + 6;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;c1 := pRGB24(ny1 + x1)^;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;c2 := pRGB24(ny1 + x3)^;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;c3 := pRGB24(ny2 + x2)^;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;c4 := pRGB24(ny3 + x1)^;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;c5 := pRGB24(ny3 + x3)^;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;r := (c1.R + c2.R + (c3.R * -12) + c4.R + c5.R) div -8;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;g := (c1.G + c2.G + (c3.G * -12) + c4.G + c5.G) div -8;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;b := (c1.B + c2.B + (c3.B * -12) + c4.B + c5.B) div -8;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if r &#60; 0 then r := 0 else if r &#62; 255 then r := 255;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if g &#60; 0 then g := 0 else if g &#62; 255 then g := 255;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if b &#60; 0 then b := 0 else if b &#62; 255 then b := 255;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;pt1 := pRGB24(ny2 + x2);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;pt1.R := r;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;pt1.G := g;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;pt1.B := b;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;inc(ny1, iDst);</div><div class="code_line">&nbsp;&nbsp; &nbsp;inc(ny2, iDst);</div><div class="code_line">&nbsp;&nbsp; &nbsp;inc(ny3, iDst);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
Можно еще через StretchBlt, только перед ним надо задать<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">SetStretchBltMode(Canvas.Handle, HALFTONE);</div></ol></div></div></div></div><br>
<br>
И еще юзаем <a class='tag-url' href='http://forum.sources.ru/index.php?act=Search' target='_blank'><span class="tag-color tag-color-named" data-value="red" style="color: red">Поиск</span></a>. Было не один раз.]]></description>
        <author>s-mike</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=97283&amp;view=findpost&amp;p=733394</guid>
        <pubDate>Mon, 30 May 2005 16:01:34 +0000</pubDate>
        <title>Нужен алгоритм качественного Resize&amp;#39;a</title>
        <link>https://forum.sources.ru/index.php?showtopic=97283&amp;view=findpost&amp;p=733394</link>
        <description><![CDATA[Aleks P.: Быстрый способ через StretchDraw знаю, но очень плохое кач-во... в форуме и FAQ&#39;у не нашел.]]></description>
        <author>Aleks P.</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	