2013-06-28 2 views
0

В настоящее время я пытаюсь добавить зеркалирование в нашу программу RotateBitmap (от http://www.efg2.com/Lab/ImageProcessing/RotateScanline.htm). Это в настоящее время выглядит следующим образом (BitMapRotated является TBitmap) в псевдо-коде:Как «слить» изменения в растровое изображение ScanLine

var 
    RowRotatedQ: pRGBquadArray; //4 bytes 

if must reflect then 
begin 
    for each j do 
    begin 
    RowRotatedQ := BitmapRotated.Scanline[j]; 
    manipulate RowRotatedQ 
    end; 
end; 

if must rotate then 
begin 
    BitmapRotated.SetSize(NewWidth, NewHeight); //resize it for rotation 
    ... 
end; 

Это работает, если я либо должен вращаться или отражать. Если я сделаю оба, то, по-видимому, вызов SetSize аннулирует мои предыдущие изменения через ScanLine. Как я могу «сбросить» или сохранить изменения? Я попробовал позвонить BitmapRotated.Handle, BitmapRotated.Dormant и установить BitmapRotated.Canvas.Pixels[0, 0], но не повезло.

Edit: Я нашел реальный вопрос - я перезаписать свои изменения со значениями из исходного растрового изображения. Извините за усилия.

+0

почему не использовать готовый LIBS как Graphics32.org или Vampyre изображения? –

+0

Я бы просто получил растровое изображение. В любом случае, ['this Q & A'] (http://stackoverflow.com/a/10633410/960757) может быть интересным для вашей задачи. – TLama

+0

@ Arioch'The: Мы уже используем эту рутину, и это казалось легкой задачей продлить ее. –

ответ

1

Возможно, это не совсем ответ, но этот код работает как в D2006, так и в XE3 и дает ожидаемый результат. Нет необходимости «промывать» что угодно.

enter image description here

procedure RotateBitmap(const BitMapRotated: TBitmap); 
    type 
    PRGBQuadArray = ^TRGBQuadArray; 
    TRGBQuadArray = array [Byte] of TRGBQuad; 
    var 
    RowRotatedQ: PRGBQuadArray; 
    t: TRGBQuad; 
    ix, iy: Integer; 
    begin 
    //first step 
    for iy := 0 to BitMapRotated.Height - 1 do begin 
     RowRotatedQ := BitMapRotated.Scanline[iy]; 
    // make vertical mirror 
     for ix := 0 to BitMapRotated.Width div 2 - 1 do begin 
     t := RowRotatedQ[ix]; 
     RowRotatedQ[ix] := RowRotatedQ[BitMapRotated.Width - ix - 1]; 
     RowRotatedQ[BitMapRotated.Width - ix - 1] := t; 
     end; 
    end; 

    //second step 
    BitMapRotated.SetSize(BitMapRotated.Width + 50, BitMapRotated.Height + 50); 
    //some coloring instead of rotation 
    for iy := 0 to BitMapRotated.Height div 10 do begin 
     RowRotatedQ := BitMapRotated.Scanline[iy]; 
     for ix := 0 to BitMapRotated.Width - 1 do 
     RowRotatedQ[ix].rgbRed := 0; 
    end; 
    end; 

var 
    a, b: TBitmap; 
begin 
    a := TBitmap.Create; 
    a.PixelFormat := pf32bit; 
    a.SetSize(100, 100); 
    a.Canvas.Brush.Color := clRed; 
    a.Canvas.FillRect(Rect(0, 0, 50, 50)); 
    b := TBitmap.Create; 
    b.Assign(a); 
    RotateBitmap(b); 
    Canvas.Draw(0, 0, a); 
    Canvas.Draw(110, 0, b); 
+0

Спасибо, я проверю в понедельник. где-то еще, чем я думаю. –

+0

Я снова проверил - см. править.: - / –