旋转缩略图和未加工图像之间的不匹配

Laughingseraphim.

新成员
加入
2016年8月16日
消息
3
编程经验
1-3
你好,

我有一个未经扫描的蓝图流入图像控制(BackBuffer)(适合图像)。我有一个可见预览设置为“缩放”,将该图像显示为大缩略图(视口)。
我使用鼠标事件在缩略图或预览图像上捕获矩形。

我试图将捕获的矩形扩展到将BackBuffer的相应区域复制到另一个图像框(Zoom_box)上。

所需的行为:我在缩略图(视口)上选择一个区域,并抓住该缩放区域以将(从BackBuffer从BackBuffer)绘制到第二个预览(Zoom_box)上。
当前行为:从未定产图像(BackBuffer)显示或复制的区域偏移,其偏移量(进一步与左侧)从缩略图中心越多。因此,如果我选择缩略图的中心(视口),我会接近较大IMG的所选中心。如果我选择右下角(视口),则获得图像的大量偏移区域(从BackBuff绘制到Zoom_box)。似乎它偏移了缩略图上的初始选择的宽度,缩放。

努力制定:
我已经阅读了大约两次答案或过去两周,下载并试图使用几个示例项目。我尝试了几种计算了矩形量表的方法。到目前为止我尝试了几种图形方法。

例子:
1/5尺度图像预览上的(10,10,100,50)的矩形 应该 转换为较大图像上的直接(50,50,500,250)。尽管似乎匹配的坐标,但是从较大图像中拉出的实际区域偏离。进一步从中心所选区域是,进一步*左*当绘制时图像被偏移。因此,选择中间,我将在偏移量中获得选择的一半宽度。如果我选择右下角,我可以获得左侧的后缓冲区和四分之一的左侧......

我的代码是这个

C#:
//On loading of an image, I get the scale values. I've tried all 3 methods below
[I]              scaleToBufferX[/I] = (([COLOR=#ff0000][B]float[/B][/COLOR])[I]BackBuffer[/I].Image.Width / [I]ViewPort[/I].ClientSize.Width );
              [I]scaleToBufferY[/I] = (([COLOR=#ff0000][B]float[/B][/COLOR])([I]BackBuffer[/I].Image.Height) / [I]ViewPort[/I].ClientSize.Height );
              [I]//resizeFactor[/I] = [COLOR=#004085]Math[/COLOR].[COLOR=#191970][B]Max[/B][/COLOR]([I]scaleToBufferX[/I],[I]scaleToBufferY[/I]);
              //[I]ScaleOf_X[/I] = ([COLOR=#ff0000][B]int[/B][/COLOR])([I]BackBuffer[/I].Image.Width / [I]resizeFactor[/I]);
              //[I]ScaleOf_Y[/I] = ([COLOR=#ff0000][B]int[/B][/COLOR])([I]BackBuffer[/I].Image.Height / [I]resizeFactor[/I]);

//I scale the rectangle to determine the area I will paint from in the next step
              [COLOR=#004085][B]Rectangle[/B][/COLOR] zoomArea = [COLOR=#008b8b][B]new[/B][/COLOR] [COLOR=#004085][B]Rectangle[/B][/COLOR](
                    ([COLOR=#ff0000][B]int[/B][/COLOR])((([I]StartX[/I])*[I]scaleToBufferX[/I]))
                    ,([COLOR=#ff0000][B]int[/B][/COLOR])((([I]StartY[/I])*[I]scaleToBufferY[/I]))
                    ,([COLOR=#ff0000][B]int[/B][/COLOR])((([I]EndX[/I]*[I]scaleToBufferX[/I])-([I]StartX[/I])*[I]scaleToBufferX[/I]))
                    ,([COLOR=#ff0000][B]int[/B][/COLOR])((([I]EndY[/I]*[I]scaleToBufferY[/I])-([I]StartY[/I])*[I]scaleToBufferY[/I]))
                                                    
     //I call the func to return the region of the larger image                                             );
[COLOR=#0000ff][B]if[/B][/COLOR]([I]loadedImage[/I] != [B]null[/B])
               {
               [I]PreviewBuffer[/I].Image = [COLOR=#191970][B]ZoomImage[/B][/COLOR]([I]loadedImage[/I], zoomArea);
               [I]zoom_Box[/I].Image = [I]PreviewBuffer[/I].Image;
               [I]zoom_Box[/I].[COLOR=#191970][B]Refresh[/B][/COLOR]();
               }

     [COLOR=#0000ff][B]private[/B][/COLOR] [COLOR=#004085]Image[/COLOR] [COLOR=#191970][B]ZoomImage[/B][/COLOR]([COLOR=#004085]Image[/COLOR] input, [COLOR=#004085][B]Rectangle[/B][/COLOR] zoomArea)
        {
               
                   //I have tried these methods, plus cloning the bitmap. I have also tried passing the width and height of the zoomarea to new Bitmap(h,w)
               [COLOR=#004085]Bitmap[/COLOR] newBmp = [COLOR=#008b8b][B]new[/B][/COLOR] [COLOR=#004085]Bitmap[/COLOR]([COLOR=#00008b]1024[/COLOR],[COLOR=#00008b]1024[/COLOR]);
             [COLOR=#008000]//Bitmap newBmp = new Bitmap(zoom_Box.ClientSize.Width,zoom_Box.ClientSize.Width);               [/COLOR]
               [COLOR=#004085]Graphics[/COLOR] g = [COLOR=#004085]Graphics[/COLOR].[COLOR=#191970][B]FromImage[/B][/COLOR](newBmp);
               g.[COLOR=#191970][B]DrawImage[/B][/COLOR](input,[COLOR=#008b8b][B]new[/B][/COLOR] [COLOR=#004085][B]Rectangle[/B][/COLOR]([COLOR=#00008b]0[/COLOR],[COLOR=#00008b]0[/COLOR],[COLOR=#00008b]1024[/COLOR],[COLOR=#00008b]1024[/COLOR]),zoomArea,[COLOR=#004085][B]GraphicsUnit[/B][/COLOR].[I]Pixel[/I]);

               [I]OldFileNameLabel[/I].Text = zoomArea.X + [COLOR=#0000ff]" "[/COLOR] + zoomArea.Y+ [COLOR=#0000ff]" "[/COLOR] +zoomArea.Width+ [COLOR=#0000ff]" "[/COLOR] +zoomArea.Height;
              [COLOR=#008000]//g.CopyFromScreen(StartX,StartY,0,0, zoomArea.Size);[/COLOR]
            
            g.[COLOR=#191970][B]Dispose[/B][/COLOR]();
            [COLOR=#000080]return[/COLOR] newBmp;
        }

没有错误,只有c#newbie的混淆。

P.S.

构成c#的两个词,不是海的或看到和尖锐的?
 
Last edited:
最佳 底部